Podaję ścieżkę do mojego polecenia w pliku / etc / profile :
export PATH=$PATH:/usr/app/cpn/bin
Moje polecenie znajduje się w:
$ which ydisplay
/usr/app/cpn/bin/ydisplay
Kiedy więc wykonuję „echo $ PATH”, wyjście wygląda następująco:
$ echo $PATH
...:/usr/app/cpn/bin
I wszystko jest w porządku, ale kiedy próbuję uruchomić polecenie za pośrednictwem SSH, pojawia się błąd:
$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found
Ale moja ścieżka jest wciąż obecna:
$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin
Wyjaśnij mi, dlaczego Bash nie może znaleźć wyświetlania podczas sesji SSH i jak prawidłowo skonfigurować SSH, aby uniknąć tego problemu.
Co więcej, jeśli podam $ PATH w lokalnym pliku .bashrc w bieżącym użytkowniku, wszystko działa poprawnie. Ale chcę zmodyfikować tylko jeden plik, zamiast tego określając wiele plików dla każdego użytkownika. Właśnie dlatego pytam.
ydisplay
? niessh 127.0.0.1 /usr/app/cpn/bin/ydisplay
działa?ssh 127.0.0.1 echo $PATH
nie robi tego, co mogłoby się wydawać: powłoka rozwija $ PATH, zanim ssh zostanie nawet wykonany, więc to niczego nie dowodzi ani nie obala.Odpowiedzi:
tl; dr
Uruchamianie
ssh 127.0.0.1 ydisplay
źródeł~/.bashrc
zamiast/etc/profile
.~/.bashrc
Zamiast tego zmień swoją ścieżkę .Detale
/etc/profile
Odczytywany jest tylko czas, gdy twoja powłoka jest „powłoką logowania”.Z podręcznika użytkownika Bash :
Ale po uruchomieniu
ssh 127.0.0.1 ydisplay
,bash
nie jest uruchomiona jako powłoka logowania. Jednak odczytuje inny plik startowy. Instrukcja Bash referencyjny mówi:Więc powinieneś wprowadzić swoje
PATH
ustawienia~/.bashrc
.W większości systemów,
~/.bash_profile
źródeł~/.bashrc
, więc możesz umieścić swoje ustawienia tylko~/.bashrc
zamiast umieszczania ich w obu plikach.Nie ma standardowy sposób, aby zmienić ustawienia dla wszystkich użytkowników, ale większość systemów mają
/etc/bashrc
,/etc/bash.bashrc
lub podobny.W przeciwnym razie skonfiguruj
pam_env
i wprowadźPATH
ustawienie/etc/environment
.Zobacz też:
źródło
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:stty
.).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.
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 przezpam_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:rshd
lubsshd
.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
:źródło