Bagaimana cara mengatur variabel lingkungan untuk semua orang di bawah sistem linux saya?

132

Bisakah saya memiliki pengaturan tertentu yang universal untuk semua pengguna saya?

TIMEX
sumber
2
Apakah itu ekspor? menambahkan itu dan itu bersifat global?
TIMEX
saya pikir itu hanya ditambahkan pada sesi saat ini, ketika Anda membuka sesi baru di terminal itu akan hilang
Haryono Sariputra

Jawaban:

104

Seperti /etc/profileyang disebutkan orang lain, beberapa sistem Linux sekarang menggunakan direktori /etc/profile.d/; setiap .shfile di sana akan bersumber oleh /etc/profile. Ini sedikit lebih rapi untuk menyimpan hal-hal lingkungan kustom Anda dalam file ini daripada hanya mengedit /etc/profile.

Kieron
sumber
4
Bagaimana jika beberapa pengguna menggunakan shell lain, seperti zsh?
Matthieu Napoli
70
ini bukan global ... terbatas pada shell .. terlalu buruk itu adalah jawaban yang paling diterima
mmm
1
zsh akan mencari file .sh di /etc/profile.d/, Anda dapat melihatnya dari / etc / zshrc @Matthieu Napoli
Bily
4
Skrip tidak digunakan untuk pengguna ROOT.
Val
38

man 8 pam_env

man 5 pam_env.conf

Jika semua layanan login menggunakan PAM , dan semua layanan login memiliki file konfigurasi session required pam_env.somasing-masing /etc/pam.d/*, maka semua sesi login akan memiliki beberapa variabel lingkungan yang ditetapkan sebagaimana ditentukan dalampam_env file konfigurasi.

Pada sebagian besar distribusi Linux modern, ini semua ada di sana secara default - cukup tambahkan variabel lingkungan global yang Anda inginkan /etc/security/pam_env.conf.

Ini berfungsi terlepas dari shell pengguna, dan juga berfungsi untuk login grafis (jika xdm / kdm / gdm / entrance / ... diatur seperti ini).

singkat
sumber
1
+1 Anda juga perlu melakukan reboot setelah menambahkan variabel di pam_env.conf langsung menyebabkan on the fly $ echo $ variablename tidak ditampilkan
9
Anda tidak perlu memulai ulang, Anda harus masuk kembali. (Tidak me-reboot server kritis untuk saya)
Lyndon White
Ini sepertinya tidak berlaku untuk distro saya, Mint 17.2. File yang sudah diinstal sepenuhnya dikomentari, dan jika saya menambahkan sesuatu seperti echo foo>/home/me/bardan reboot (dan login lagi), file itu tidak dapat dibuat. (Mungkin ada cara yang lebih elegan untuk menguji ini, tetapi saya ingin memastikan sebelum berkomentar di sini.)
Michael Scheper
16

Hebatnya, Unix dan Linux sebenarnya tidak memiliki tempat untuk mengatur variabel lingkungan global. Yang terbaik yang dapat Anda lakukan adalah mengatur agar shell tertentu memiliki inisialisasi khusus situs.

Jika Anda memasukkannya /etc/profile, itu akan menangani hal-hal untuk sebagian besar pengguna shell yang kompatibel dengan posix. Ini mungkin "cukup baik" untuk tujuan yang tidak kritis.

Tetapi siapa pun yang memiliki cshatau tcshshell tidak akan melihatnya, dan saya tidak percaya cshmemiliki file inisialisasi global.

DigitalRoss
sumber
8
/etc/environmentsebenarnya tampaknya mengatur variabel lingkungan untuk saya, bahkan sebagai pengguna root. Saya tahu itu /etc/environmentada di amazon linux dan ubuntu. Saya tidak dapat memeriksa apakah berfungsi untuk csh, tcsh, atau zsh.
Jordan Stewart
itu tidak spesifik untuk shell yang Anda gunakan, itu benar-benar global
Xerus
9

Beberapa kutipan menarik dari bash manpage:

Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan --loginopsi, bash pertama kali membaca dan mengeksekusi perintah dari file /etc/profile, jika file itu ada. Setelah membaca file itu, ia mencari ~/.bash_profile, ~/.bash_login dan ~/.profile, agar, dan membaca dan mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca. The --noprofilepilihan mungkin digunakan ketika shell dimulai untuk menghambat perilaku ini.
...
Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari /etc/bash.bashrcdan ~/.bashrc, jika file-file ini ada. Ini mungkin terhambat dengan menggunakan--norc opsi. Itu--rcfileopsi file akan memaksa bash untuk membaca dan menjalankan perintah dari file alih-alih /etc/bash.bashrcdan ~/.bashrc.

Jadi lihat /etc/profileatau /etc/bash.bashrc, file-file ini adalah tempat yang tepat untuk pengaturan global. Letakkan sesuatu seperti ini di dalamnya untuk mengatur variabel lingkungan:

export MY_VAR=xxx
Thivent Pascal
sumber
Perhatikan bahwa pada sistem Unix klasik, baik Bourne shell dan Korn shell juga membaca / etc / profile - ini mungkin merupakan lokasi yang paling banyak digunakan untuk pengaturan lingkungan sistem. Beberapa versi C shell terlihat di /etc/csh.cshrc dan /etc/csh.login serta lokasi per-pengguna; yang lain tidak menggunakan file pengaturan lingkungan sistem.
Jonathan Leffler
Luar biasa, hanya apa yang saya cari sejauh pengaturan env untuk pengguna shell non-login.
David Mann
Maaf, sepertinya saya tidak sengaja menurunkan ini ketika beberapa saat panahnya tidak terlihat ... maukah Anda mengedit ini (salah ketik "environmentEment" di baris kedua hingga terakhir, misalnya) agar saya dapat menghapus downvote?
Benjamin W.
4

Menggunakan PAM sangat baik.

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

sumber
2

Setiap proses yang berjalan di bawah kernel Linux menerima lingkungannya sendiri dan unik yang diwarisi dari induknya. Dalam hal ini, induknya bisa berupa shell itu sendiri (menelurkan sub shell), atau program 'login' (pada sistem tipikal).

Karena setiap lingkungan proses dilindungi, tidak ada cara untuk 'menyuntikkan' variabel lingkungan ke setiap proses yang berjalan, jadi bahkan jika Anda memodifikasi shell .rc / profil default, itu tidak akan berlaku sampai setiap proses keluar dan memuat ulang pengaturan memulai.

Lihat di / etc / untuk memodifikasi variabel start up default untuk shell tertentu. Sadarilah bahwa pengguna dapat (dan sering melakukan) mengubahnya dalam pengaturan masing-masing.

Unix dirancang untuk mematuhi pengguna, dalam batas-batas tertentu.

NB : Bash bukan satu - satunya shell di sistem Anda. Perhatikan baik-baik apa yang sebenarnya ditunjukkan oleh tautan simbol / bin / sh. Pada banyak sistem, ini sebenarnya bisa berupa tanda hubung yang (secara default, tanpa permintaan khusus) secara POSIXLY benar. Oleh karena itu, Anda harus berhati-hati untuk memodifikasi kedua default, atau skrip yang dimulai dengan / bin / sh tidak akan mewarisi default global Anda. Demikian pula, berhati-hatilah untuk menghindari sintaks yang hanya dimengerti bash saat mengedit keduanya, alias avoiding bashisms.

Pos Tim
sumber