Jak ustawić zmienną środowiskową dla wszystkich w moim systemie Linux?

137

Czy mogę mieć pewne ustawienia, które są uniwersalne dla wszystkich moich użytkowników?

TIMEX
źródło
2
Czy to EKSPORT? dodać to i jest globalne?
TIMEX
myślę, że jest dodawany tylko do bieżącej sesji, kiedy otworzysz nową sesję w terminalu, zniknie
Haryono Sariputra

Odpowiedzi:

107

Jak /etc/profilewspominali inni, niektóre systemy Linux używają teraz katalogu /etc/profile.d/; wszelkie .shpliki tam będą pochodzić z /etc/profile. Nieco lepiej jest zachować swoje własne środowisko w tych plikach niż tylko edytować /etc/profile.

Kieron
źródło
5
Co jeśli niektórzy użytkownicy używają innej powłoki, np. Zsh?
Matthieu Napoli
75
to nie jest globalne… jest ograniczone do powłoki… szkoda, że ​​jest to najbardziej akceptowana odpowiedź
mmm
1
zsh będzie pobierać pliki .sh w /etc/profile.d/, możesz to zobaczyć z / etc / zshrc @Matthieu Napoli
Bily
4
Skrypty nie są używane dla użytkownika ROOT.
Val
38

man 8 pam_env

man 5 pam_env.conf

Jeśli wszystkie usługi logowania używają PAM , a wszystkie usługi logowania mają session required pam_env.sow swoich /etc/pam.d/*plikach konfiguracyjnych, wówczas wszystkie sesje logowania będą miały pewne zmienne środowiskowe ustawione zgodnie z opisem w pam_envpliku konfiguracyjnym.

W większości nowoczesnych dystrybucji Linuksa to wszystko jest dostępne domyślnie - wystarczy dodać żądane globalne zmienne środowiskowe do /etc/security/pam_env.conf.

Działa to niezależnie od powłoki użytkownika i działa także w przypadku logowania graficznego (jeśli xdm / kdm / gdm / entrance /… jest tak skonfigurowane).

ephemient
źródło
1
+1 musisz również zrestartować po dodaniu zmiennej w pam_env.conf, ponieważ natychmiast w locie $ echo $ zmienna
9
Nie musisz restartować, musisz się ponownie zalogować. (Bez ponownego uruchamiania krytycznych serwerów dla mnie)
Lyndon White
Wydaje się, że nie dotyczy to mojej dystrybucji Mint 17.2. Preinstalowany plik jest całkowicie zakomentowany, a jeśli dodam coś podobnego echo foo>/home/me/bari uruchomię ponownie (i ponownie się zaloguję), plik ten nie zostanie utworzony. (Prawdopodobnie istnieje bardziej elegancki sposób, aby to przetestować, ale chciałem się upewnić przed komentarzem tutaj.)
Michael Scheper
16

O dziwo, Unix i Linux tak naprawdę nie mają miejsca na ustawianie globalnych zmiennych środowiskowych. Najlepsze, co możesz zrobić, to zaaranżować, aby określona powłoka miała inicjalizację specyficzną dla witryny.

Jeśli to umieścisz, to załatwi sprawę /etc/profiledla większości użytkowników powłoki zgodnych z Posix. Jest to prawdopodobnie „wystarczająco dobre” do celów niekrytycznych.

Ale każdy, kto ma powłokę cshlub tcsh, nie zobaczy tego i nie sądzę, aby cshmiał globalny plik inicjujący.

DigitalRoss
źródło
8
/etc/environmentwydaje się, że ustawia dla mnie zmienne środowiskowe, nawet jako użytkownik root. Wiem, że /etc/environmentjest to na Amazon Linux i Ubuntu. Nie udało mi się sprawdzić, czy działa dla csh, tcsh lub zsh.
Jordan Stewart
nie jest specyficzna dla używanej powłoki, jest prawdziwie globalna
Xerus,
9

Kilka interesujących fragmentów strony podręcznika bash:

Gdy bash jest wywoływany jako interaktywna powłoka logowania lub jako powłoka nieinteraktywna z --loginopcją, najpierw odczytuje i wykonuje polecenia z pliku /etc/profile, jeśli ten plik istnieje. Po przeczytaniu tego pliku, szuka ~/.bash_profile, ~/.bash_logini ~/.profile, w tej kolejności, a odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny. --noprofileOpcja może być stosowany, gdy powłoka jest uruchamiany w celu zahamowania tego zachowania.
...
Kiedy uruchamiana jest powłoka interaktywna, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z /etc/bash.bashrci ~/.bashrc, jeśli te pliki istnieją. Można to powstrzymać za pomocą --norcopcji. Plik--rcfilePlik opcja zmusi bash do czytania i wykonywania poleceń z pliku zamiast /etc/bash.bashrci ~/.bashrc.

Więc spójrz na /etc/profilelub /etc/bash.bashrc, te pliki są odpowiednimi miejscami dla ustawień globalnych. Umieść w nich coś takiego, aby ustawić zmienną środowiskową:

export MY_VAR=xxx
Pascal Thivent
źródło
Zauważ, że w klasycznych systemach Unix, zarówno powłoka Bourne'a, jak i powłoka Korna również odczytują / etc / profile - jest to prawdopodobnie najczęściej używana lokalizacja do ustawiania środowiska systemowego. Niektóre wersje powłoki C wyglądają w /etc/csh.cshrc i /etc/csh.login, a także w lokalizacjach dla poszczególnych użytkowników; inne nie używają żadnego pliku ustawień środowiska systemowego.
Jonathan Leffler
Niesamowite, właśnie tego szukałem, jeśli chodzi o ustawienie środowiska env dla użytkowników powłoki niezalogowanych.
David Mann
Przepraszam, wydaje mi się, że przypadkowo przegłosowałem to, gdy przez chwilę strzałki nie były widoczne ... czy mógłbyś edytować to (na przykład literówka „environment” w przedostatniej linii), abym mógł usunąć głos przeciw?
Benjamin W.
4

Korzystanie z PAM jest doskonałe.

# 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

źródło
2

Każdy proces działający w jądrze Linuksa otrzymuje własne, unikalne środowisko, które dziedziczy po swoim rodzicu. W tym przypadku rodzic będzie albo samą powłoką (tworzącą podpowłokę), albo programem „login” (w typowym systemie).

Ponieważ środowisko każdego procesu jest chronione, nie ma możliwości `` wstrzyknięcia '' zmiennej środowiskowej do każdego działającego procesu, więc nawet jeśli zmodyfikujesz domyślną powłokę .rc / profile, nie wejdzie ona w życie, dopóki każdy proces nie zakończy się i nie załaduje ponownie ustawienia uruchamiania.

Zajrzyj do / etc /, aby zmodyfikować domyślne zmienne startowe dla konkretnej powłoki. Po prostu uświadom sobie, że użytkownicy mogą (i często to robią) zmieniać je w swoich indywidualnych ustawieniach.

Unix jest zaprojektowany tak, aby był posłuszny użytkownikowi w pewnych granicach.

NB : Bash nie jest jedyną powłoką w twoim systemie. Zwróć szczególną uwagę na to, na co faktycznie wskazuje dowiązanie symboliczne / bin / sh. W wielu systemach może to być myślnik, który (domyślnie, bez specjalnego wywołania) jest POSIXLY poprawny. Dlatego powinieneś uważać, aby zmodyfikować oba ustawienia domyślne, w przeciwnym razie skrypty rozpoczynające się od / bin / sh nie odziedziczą twoich globalnych ustawień domyślnych. Podobnie, uważaj, aby unikać składni zrozumiałej tylko dla bash podczas edycji obu avoiding bashisms.

Tim Post
źródło