Mam bliźniacze serwery Linux, które powinny być skonfigurowane identycznie, jednak polecenia ssh do jednego z nich zawodzą w przypadku poleceń wymagających ścieżki określonej w ~ / .bashrc. Na przykład mogę użyć polecenia pwd
interaktywnego i ssh, ale jeśli spróbuję uruchomić program, który znajduje się w folderze bin aplikacji, działa on tylko w interaktywnej powłoce dla jednego z serwerów.
Plik / etc / profile i / etc / environment na obu serwerach są identyczne, jednak $ BASH_ENV jest ustawiony na ~ / .bashrc na serwerze, który działa poprawnie. Chcę ustawić $ BASH_ENV na serwerze, który nie działa, ale wolałbym ustawić go w tej samej lokalizacji, co ustawiony na działającym serwerze. Jakie są miejsca, w których Linux będzie działał podczas nieinteraktywnego logowania, na przykład polecenie ssh z innego komputera?
edycja: wiersz w / etc / passwd dla użytkownika określa / bin / bash na obu serwerach. Plik ~ / .bash_profile dla obu serwerów jest identyczny i zawiera if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
. Jedyna różnica między systemami polega na tym, że $ BASH_ENV jest ciągiem zerowym na serwerze, który nie działa, i nie mogę znaleźć, gdzie został ustawiony na działającym serwerze.
edycja 2: Plik środowiska ~ / .ssh / na obu serwerach ma BASH_ENV = ~ / .bashrc
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Odpowiedzi:
BASH_ENV
zostanie ustawiony tylko za pośrednictwem środowiska lub innego skryptu pozyskiwanego podczas inicjowania. W przypadku powłoki nieinteraktywnej będzie próbowała uzyskać dodatkowe pliki tylko wtedy, gdy ta powłoka jest również powłoką logowania. (w tym przypadku będzie to czytać~/.bash_profile
,~/.bash_login
i~/.profile
... ale jeśli to robi, że nie będzie doświadcza problemu)Pierwsze miejsce, na które należy spojrzeć, to środowisko, w którym wywoływana jest podpowłoka.
BASH_ENV
zmienna zostanie przekazana. Pamiętaj, że może to być zakopane w źródłowym pliku.BASH_ENV=blah /path/to/somecommand.sh
. To wyróżnia się jak obolały kciuk, więc prawdopodobnie go złapałeś.Jeśli jest ustawiony po zalogowaniu, ale nie możesz dowiedzieć się, gdzie to jest, być może będziesz musiał sprawdzić, co jest odpowiedzialne za budowę środowiska logowania.
Wszystkie zwykłe pliki pozyskiwane przez powłokę logowania.
man bash
na wyczerpującą listę.PAM : Jak sugeruje freiheit w komentarzach, sprawdź
/etc/security/pam_env.conf
i wszelkie dodatkowe pliki, do których się odwołujepam_env.so
. Inne moduły PAM również mogą być odpowiedzialne, ale jeśli twoje konfiguracje PAM wyglądają identycznie, prawdopodobnie tak nie jest.sshd : skanuje następujące pliki w kolejności:
~/.ssh/environment
(przed przejściem do katalogu domowego; tylko jeśliPermitUserEnvironment
jest włączony wsshd_config
)~/.ssh/rc
(po przejściu do katalogu domowego; zawsze)/etc/ssh/sshrc
(jeśli~/.ssh/rc
nie jest obecny)Uwaga:
sshd
skanuje równieżenvironment=value
linie w pliku autoryzowanych kluczy użytkownika (jeśliPermitUserEnvironment
jest włączony), ale nie jest jasne na stronie podręcznika, gdzie ten krok mieści się w powyższej sekwencji.źródło
PermitUserEnvironment yes
jest ustawiony w / etc / ssh / sshd_config na działającym serwerze, ale nie stanowi problemu. Zmieniłem to, ale właśnie przetestowałem polecenie i nie zadziałało ponownie. Czy ten plik jest analizowany przy każdej próbie ssh? Nie mam pliku ~ / .ssh / rc dla użytkownika, nad którym pracuję, i nie ma pliku / etc / ssh / sshrc w żadnym systemie.sshd
. Oznacza to również, że na działającym serwerze może znajdować się plik (sprawdź listę, które ci dałemsshd
), który ustawia środowisko.