Jakie jest najlepsze miejsce do ustawienia zmiennych systemowych dla całego systemu Linux?

26

Chcę tylko ustawić zmienną środowiskową JAVA_HOMEdla całego systemu, dla wszystkich użytkowników, w tym użytkownika root .

Wymagania:

  • dostępne dla zwykłych użytkowników
  • dostępne do rootowania
  • zawsze ładowany, nie tylko dla bash (gnome-terminal domyślnie nie uruchamia basha)
  • do pracy z Ubuntu, Debian i opcjonalnie Red Hat
  • świetnie, jeśli można łatwo napisać dodatek
sorin
źródło
W przypadku interaktywnych powłok sprawdź ten wątek z zapytaniem ubuntu .
szybka zmiana w

Odpowiedzi:

26

Ponieważ nikt nie dodał tutaj pełnej odpowiedzi, obecnie uważam to za najlepszą, przynajmniej dla Ubuntu, ale jestem otwarty na dostosowanie odpowiedzi dla innych platform * nix.

# **create**: /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/default-java

Inne opcje, które zostały już rozważone, ale zostały wykluczone:

  • /etc/environment działa, ale jest trudniejszy w utrzymaniu, ponieważ inne narzędzia lub ludzie mogą go edytować.
  • /etc/profile - tak samo jak powyżej
sorin
źródło
11

Na Debianie / Ubuntu będzie to / etc / environment

Nie znam odpowiednika Red Hat.

zobiektywizowany
źródło
1
Uważam, że / etc / environment jest przestarzałe
Pat James
@PatJames, czy masz więcej informacji na ten temat? Próbowałem / etc / środowisko nie jest ładowane dla roota nawet po ponownym uruchomieniu komputera.
sorin
@SorinSbarnea niektóre informacje są tutaj: wiki.debian.org/Locale, wskazując, że / etc / environment nie jest już używany w nowszych wersjach
Pat James
1
Ta strona mówi tylko, że nie powinieneś, ale zmienne dotyczące ustawień regionalnych /etc/environment. Zobacz także serverfault.com/a/584072/26218
Flow
11

Nie rozumiem, dlaczego wykluczyłeś / etc / profile. To jest poprawna lokalizacja.

dmourati
źródło
9

Kilku odpowiedziało, że /etc/environmentjest to deprecjonowane i / lub nie jest już używane w Debianie, a to jest (jak w wersji 7) fałszywe.

Plik jest w rzeczywistości odczytywany przez PAM, a konkretnie pam_env(8)przez domyślną envfileflagę. Strona man podaje również tę wartość domyślną w sekcji PLIKI.

Cytowane strony wiki (zwłaszcza lokalna) jedynie stwierdzają, że zmienne środowiskowe oparte na ustawieniach regionalnych powinny się teraz znajdować /etc/profile. Ich stwierdzenie „(w starszych wersjach Debiana, także / etc / environment)” jest niejasne i dotyczy kontekstów regionalnych.

Szybki grep poprzez /etc/pam.dpokazy:

root@box:/etc/pam.d# grep pam_env.so *
atd:auth        required        pam_env.so
cron:session       required   pam_env.so
cron:session       required   pam_env.so envfile=/etc/default/locale
login:session       required   pam_env.so readenv=1
login:session       required   pam_env.so readenv=1 envfile=/etc/default/locale
sshd:auth       required     pam_env.so # [1]
sshd:auth       required     pam_env.so envfile=/etc/default/locale
su:session       required   pam_env.so readenv=1
su:session       required   pam_env.so readenv=1 envfile=/etc/default/locale

Te wiersze konfiguracji są addytywne, a ponieważ brakuje pierwszego envfile, domyślnie jest to /etc/environment.

Wszystko to oczywiście opiera się na wszelkich crondplikach binarnych, których używasz ( powłoki logowania itp.), Skompilowanych z PAM.

Wreszcie oznacza to, że inne systemy korzystające z PAM (np. RedHat) zachowują się tak samo, jak widać na ich stronie podręcznika.

lingfish
źródło
2

Uwaga dodatkowa: spójrz na środowisko modułów . Używam tego za każdym razem, gdy muszę zaoferować dziesiątki lub setki użytkownikom złożone, wersjonowane, samorozszerzalne, zwięzłe środowisko UNIX. Jest stosowany głównie w wielkoskalowych środowiskach HPC dla wielu użytkowników. Samo użycie go dla jednej konkretnej zmiennej jest z pewnością nadmierną inżynierią, ale robi niesamowitą robotę, gdy potrzebujesz więcej niż kilku pakietów oprogramowania i ich środowiska.

pfo
źródło
1

/etc/profilepowinno działać. Testowałem właśnie teraz, aby mieć pewność, włożyć export SOMETEST=1234do /etc/profilei po ponowne rejestrowanie echo $SOMETESTdał mi 1234, jak oczekiwano. Również zgnome-terminal

wk.
źródło
0

W tym przypadku nie można użyć ~ określonych plików. więc....

/etc/profilebyłoby w tym przypadku właściwym miejscem. Obecnie zalogowani użytkownicy muszą uzyskać nową sesję logowania, ale nie powinno to stanowić większego problemu.

@ wk01: domyślnie /etc/profilenie jest ładowany przez powłokę niezalogowaną. Twój .bashrc jest prawdopodobnie załadowaniem ...

trzeźwy
źródło