Ustawianie globalnej zmiennej środowiskowej dla wszystkich

17

Jeśli ustawię zmienną /etc/environment, wydaje się, że ma ona zastosowanie tylko do administratorów sudo su.

Jak sprawić, by zmienne miały zastosowanie do wszystkich? Zwłaszcza gdy są w terminalu? Czy ustawienia /etc/enviromentnie dotyczą bash?

Mick.D
źródło

Odpowiedzi:

13

/etc/environmentAktualizacja będzie działać tylko na następnej sesji, nie jest automatycznie przeładowana.

Co oznacza, że ​​nie możesz tego zmienić dla sesji, które już się rozpoczęły dla innych użytkowników.

Jeśli chcesz „przeładować” wszystko, co jest w /etc/environmentśrodku, potrzebujesz następującego polecenia:

source /etc/environment

Ale znowu będzie to działać tylko dla twojej bieżącej sesji, inni użytkownicy nie zostaną dotknięci, dopóki nie rozpoczną nowej sesji lub nie uruchomią powyższego polecenia we własnej sesji.

Panthro
źródło
4

TL; DR

Te pliki konfiguracyjne globalne ( /etc/environment, /etc/profile) lub specyficzne dla użytkownika ( ~/.profile, ~/.bashrc) są przetwarzane tylko przy następnym logowaniu / sesji.

Te globalne pliki zastosowanie do wszystkich użytkowników (nie tylko roota) ... ale trzeba zrestartować sesji użytkownika, aby zobaczyć odzwierciedleniem zmian w środowisku. Może się to zdarzyć, dzwoniąc sujak zaobserwowałeś ... lub wylogowując się / logując lub uruchamiając ponownie. Mógłbyś sudo użytkownika innego niż root i zobaczyłbyś, że oni również mają zmiany środowiska.

Powodem, dla którego musisz zrestartować się lub zalogować ponownie, aby uzyskać globalne środowisko, jest to, że środowisko jest dziedziczone z procesów nadrzędnych, a proces root dla wszystkiego, co uruchamiasz, to twoja powłoka logowania ... więc jeśli twoja powłoka logowania nie ma środowisko ... to też procesy nie zaczynają się w powłoce logowania. Możesz oczywiście ustawić / zaktualizować środowisko dla poszczególnych procesów podczas ich uruchamiania, ale musiałbyś ustawić środowisko dla powłoki logowania i zrestartować wszystkie podprocesy, aby zobaczyć zmianę.

Globalnego Środowiska

Jak ktoś inny wspomniano, potrzebny jest restart lub wylogowania / login, aby zmiany /etc/profile, /etc/profile.d/*.sha /etc/environmentdo odebrania.

Wynika to z faktu, że chociaż pliki te określają środowisko globalne ... są one uruchamiane tylko raz podczas logowania, więc istniejące dane logowania / sesje nie odzwierciedlają zmian w tych plikach. Ponowne uruchomienie „resetuje” login każdego użytkownika, zmuszając go do pobrania nowego środowiska.

W swojej własnej sesji logowania możesz source /etc/profilew celu odebrania zmian bez ponownego uruchomienia komputera lub wylogowania / logowania ... ale to wpłynie tylko na twoją sesję i nowe procesy uruchomione w tej sesji.

Zauważ też, że nie ma interpolacji zmiennych /etc/environment(nie jest to skrypt), więc nie możesz robić takich rzeczy PATH="$PATH:/my/custom/path".

Zauważ też, że /etc/profilei /etc/profile.d/*.shsą uruchamiane tylko dla sesji logowania, więc skonfigurowane środowisko nie będzie dostępne dla systemowych kont niezalogowanych (tj. Jeśli próbujesz ustawić zmienną środowiskową dla procesu demona, który działa poza powłoką logowania).

Zauważ, że bashrcnie jest to przydatne do ustawiania środowiska dla całej powłoki logowania, ale dla powłok bash i podprocesów ... więc dla prawdziwej „globalnej” lub „globalnej użytkownika” prawdopodobnie chcesz umieścić konfigurację środowiska w /etc/profilelub /etc/profile.d/my-custom-env.shlub ~/.profile. Inne powłoki (np. Zsh) mają również własne pliki konfiguracyjne, więc konfiguracja środowiska niespecyficzna dla bash w bashrc spowoduje problemy lub zamieszanie, jeśli / podczas zmiany powłoki (lub gdy inni użytkownicy w systemie będą używać różnych powłok).

Częstym problemem jest instalowanie nowego programu i trzeba określić pewne środowisko, aby działało poprawnie. Globalne środowisko to jedna odpowiedź, ale często będzie wymagało restartu, który nie jest idealny dla serwerów i przypadków automatycznego udostępniania / konfigurowania przypadków użycia. Powinieneś zadać sobie pytanie, czy tak naprawdę jest to zmienna, której potrzebują wszyscy użytkownicy i programy w systemie, czy też jest to po prostu coś, co musisz udostępnić konkretnemu użytkownikowi lub programowi.

Dla konkretnego użytkownika

spójrz na włączenie środowiska w profilu lub bashrc w katalogu osobistym użytkownika (np. ~/.profile ~/.bashrc) w zależności od tego, czy chcesz to dla interaktywnych, powłok logowania, tylko bash itp.

Należy pamiętać, że wymaga to również ponownego uruchomienia lub wylogowania / logowania, aby zmiany środowiska były dostępne dla wszystkich procesów w sesji logowania użytkownika. Użytkownik może source ~/.profile... ale odbywa się to w terminalu i aktualizuje środowisko tylko w tej sesji terminala i procesach potomnych ... niekoniecznie dla całego środowiska logowania użytkownika.

W przypadku konkretnego programu istnieje kilka opcji.

Jednym z nich jest zapewnienie środowiska podczas uruchamiania polecenia:

VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2

Jeśli używasz systemd, możesz również określić środowisko w pliku jednostki / usługi w obszarze za [Service]pomocąEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE

Ta opcja może wydawać się niezręczna, ponieważ musisz określać środowisko przy każdym uruchomieniu programu, ale jeśli środowisko jest naprawdę potrzebne tylko temu programowi ... to naprawdę najlepszy sposób i powinieneś się do niego przyzwyczaić i nie zrzucać wszystkiego do pliku bashrc lub profilu.

Jeśli nie używasz systemd lub init do konfigurowania środowiska i uruchamiania programu ... to oczywiście możesz po prostu owinąć wykonanie programu skryptem bash, w którym zapisujesz pełne polecenie łącznie z konfiguracją środowiska dla wygody.

Bibliografia:

Istnieje również bardzo szczegółowa odpowiedź tutaj, którą sugeruję przeczytać: /ubuntu//a/247769/824160

matpr
źródło
3

utwórz niestandardowy skrypt powłoki w

/etc/profile.d/

dodaj globalne zmienne środowiskowe do utworzonego skryptu, uruchom ponownie komputer, a wtedy będzie dostępny dla wszystkich.

shalamus
źródło
Uważam, że jest to bardziej niezawodne podejście niż edytowanie pliku środowiska / etc /, ponieważ plik ten może być zmieniany podczas aktualizacji pakietów.
phreed
2

Dodanie zmiennej do /etc/environmentmnie zadziałało.

Jednak po zmianie musiałem zrestartować się, aby zmiana zaczęła /etc/environmentobowiązywać. Samo zamknięcie i ponowne otwarcie okna terminala nie było wystarczające.

kris
źródło
3
Zawsze możesz zrobić, source /etc/environmentaby go ponownie załadować.
Panthro,
Wylogowanie i ponowne zalogowanie powinno wystarczyć.
Karuhanga,