Historycznie pliki profilu ( /etc/profile
i ~/.profile
) były wywoływane po zalogowaniu (w konsoli tekstowej, co jeszcze?) I służyły wielu celom:
- Ustaw zmienne środowiskowe i inne parametry (np. Umask) dla sesji.
- Uruchom dodatkowe programy na początku sesji (np. Powiadomienie e-mail).
- Uruchom program dla sesji, jeśli różni się od powłoki (np. Innej powłoki lub X Window).
- Ustaw parametry terminala (np
stty
.).
- Ustaw parametry powłoki (np. Aliasy).
Wszystkie te cele zostały zidentyfikowane jako odrębne dopiero później. Ponieważ skrypty profilowe mogą robić rzeczy, które mają sens tylko w sesji interaktywnej (interakcja terminalu, uruchamianie innych programów), kiedy wprowadzono zdalne wywoływanie powłoki ( rsh ), marki rsh zdecydowały, że nie będą wywoływać powłoki zdalnej jako powłoki logowania, aby skrypty profilu nie były wykonywane. (Niektóre wersje rshd
mają opcję uruchamiania powłoki zdalnej jako powłoki logowania.) Ssh skopiowało to zachowanie, aby zastąpić rsh.
Jeśli chcesz, aby skrypty profilowe były wykonywane, możesz je wywołać jawnie.
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
Zanotuj polecenie .
załadowania skryptów profilu wewnątrz powłoki: są to polecenia do wykonania w tej powłoce, a nie program zewnętrzny.
Jeśli chcesz ustawić zmienną środowiskową globalnie dla wszystkich użytkowników, w wielu systemach istnieje inna metoda: zamiast definiować ją w /etc/profile
, zdefiniuj ją w /etc/environment
. Ten plik jest czytany przez pam_env
moduł; większość dystrybucji Linuksa jest skonfigurowana do czytania.
Jeśli twoja powłoka logowania jest bash, istnieje kolejna możliwość. Zwykle nie należy ustawiać zmiennych środowiskowych w.bashrc
(ponieważ nie zostaną one ustawione w sesjach X, chyba że przejdziesz przez terminal z interaktywną powłoką, ponieważ nie zostaną one ustawione, jeśli zalogujesz się interaktywnie w konsoli tekstowej lub ssh, ponieważ zastąpią ustawienia niestandardowe, jeśli wywołasz powłokę w innym programie). Jednak bash ma dziwną funkcję, której nigdy nie rozumiałem: czyta się ~/.bashrc
w dwóch niepowiązanych okolicznościach:
- w interaktywnych powłokach, które nie są powłokami logowania;
- w nieinteraktywnych powłokach, które nie są powłokami logowania, jeśli bash uważa, że zostało wywołane przez
rshd
lub sshd
.
Gdy uruchomisz polecenie przez ssh, znajdziesz się w drugim przypadku. Możesz ustalić, że Twój profil będzie czytany przez czytanie /etc/profile
i .profile
od .bashrc
. Dołącz następujący kod do ~/.bashrc
:
case $- in
*i*) :;; # this is an interactive shell, fine
*) # This is not an interactive shell! This must be a non-interactive remote shell session.
. /etc/profile; . ~/.profile
return;;
esac
ydisplay
? niessh 127.0.0.1 /usr/app/cpn/bin/ydisplay
działa?