Gdzie zazwyczaj ustawiony jest $ BASH_ENV?


19

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 pwdinteraktywnego 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


1
Czy plik / etc / passwd jest identyczny na obu serwerach? Jeśli bash zostanie wywołany jako „/ bin / sh” zamiast „/ bin / bash”, nie odczyta żadnych plików bashrc (tylko pliki profilów).
freiheit

Nie identyczne, ale użytkownik wysyłam polecenia, który ma taką samą linię w / etc / passwd w obu systemach.
Basil

A co z ~ / .profile i ~ / .bash_profile?
freiheit

są identyczne i oba zawierająif [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Basil

Sprawdziłeś, czy / etc / bashrc i /etc/profile.d/* są identyczne? ~ / .bash_login? /etc/pam.d/*? /etc/security/pam_env.conf?
freiheit

Odpowiedzi:


21

BASH_ENVzostanie 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_logini ~/.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.

  • Eksportowana BASH_ENVzmienna zostanie przekazana. Pamiętaj, że może to być zakopane w źródłowym pliku.
  • Może być wprowadzony jako parametr w tym samym wierszu wywołującym skrypt, tj 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 bashna wyczerpującą listę.

  • PAM : Jak sugeruje freiheit w komentarzach, sprawdź /etc/security/pam_env.confi wszelkie dodatkowe pliki, do których się odwołuje pam_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śli PermitUserEnvironmentjest włączony w sshd_config)
    • ~/.ssh/rc (po przejściu do katalogu domowego; zawsze)
    • /etc/ssh/sshrc(jeśli ~/.ssh/rcnie jest obecny)

Uwaga: sshdskanuje również environment=valuelinie w pliku autoryzowanych kluczy użytkownika (jeśli PermitUserEnvironmentjest włączony), ale nie jest jasne na stronie podręcznika, gdzie ten krok mieści się w powyższej sekwencji.


Znalazłem różnicę! PermitUserEnvironment yesjest 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.
Basil

Och, myślę, że muszę ponownie zainicjować ssh? /etc/init.d/sshd?
Basil

@Basil Tak, musisz zrestartować sshd. Oznacza to również, że na działającym serwerze może znajdować się plik (sprawdź listę, które ci dałem sshd), który ustawia środowisko.
Andrew B,

Tak, to była frustrująca część - wszystko, czego potrzebuję, jest ustawione w .bashrc, który po prostu nie był uruchamiany :) Dziękuję bardzo za twoją pomoc - Planuję zmianę, aby ponownie zainicjować SSH i zgłoś się. Zakładam, że to zadziała.
Basil

Właśnie skończyłem ponowne inicjowanie SSH i moje nieinteraktywne polecenia SSH już działają! Dziękuję bardzo za pomoc, nigdy nie znalazłem tego pola na własną rękę.
Basil,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.