Jak ustawić PATH podczas uruchamiania polecenia ssh?

18

Zakładając, że użytkownik ma /bin/bashpowłokę /etc/passwd. Następnie ssh user@host commanduruchamia polecenie za pomocą Bash. Jednak powłoka ta nie jest ani logowana, ani interaktywna, co oznacza, że ​​ani ~/.bash_profilenie ~/.bashrcjest pozyskiwana. W takim przypadku, jak ustawić PATHzmienną środowiskową, aby można było znaleźć i wykonać pliki wykonywalne? Czy zaleca się prefiks rzeczywistego polecenia source ~/.bashrc?

Cyker
źródło
5
.bashrcjest pozyskiwany, ale prawdopodobnie ma test interaktywności u góry. Rzeczy, które umieściłeś przed tym sprawdzeniem, powinny mieć zastosowanie, i to właśnie robię, aby wymusić ŚCIEŻKĘ, gdy serwer nie zezwala na środowisko użytkownika ani używanie ~/.pam_environment.
muru

Odpowiedzi:

18

Masz kilka możliwości:

  • Ustaw PATHna serwerze w ~/.ssh/environment(musi być włączony przez PermitUserEnvironment yesinsshd_config ).
  • Użyj pełnej ścieżki do pliku binarnego
  • Jak wspomniałeś, ręcznie źródło .bashrc: przedrostek polecenia za pomocą . ~/.bashrc(lub source)

Zależy to od przypadku użycia, w którą stronę pójdziesz.

Jakuje
źródło
6
~/.bashrcPozyskiwanie ręczne nie jest konieczne, dzieje się to domyślnie. To wydaje mi się złym pomysłem.
sorontar,
$PATHnie rozwija się ~/.ssh/environment, przynajmniej nie w OpenSSH_7.9p1, OpenSSL 1.1.1b 26 Feb 2019.
Jaakko
1
@Jaakko Prawdopodobnie jest wyłączony w sshd_config przy użyciu PermitUserEnvironment(domyślnie w najnowszych wersjach)
Jakuje
Zrozumiałem, że nie rozwijało się, ponieważ dodałem linię PATH="$PATH:/new/path"do mojej, ~/.ssh/environmentkiedy powinno byćPATH=$PATH:/new/path
Jaakko,
4

Przyrównujesz ustawienia lokalne do ustawień zdalnych .

Lokalnie instancja bash, bieżąca działająca powłoka, w której piszesz:

ssh user@host command

Wykona polecenie ssh (nic więcej) jako ssh klienta.
Aby to zrobić, lokalna powłoka nie musi uruchamiać podpowłoki, nowej powłoki ani logować się.

Polecenie jest wykonywane jako lspolecenie: lokalnie.

Jest to komenda ssh klienta, która otwiera połączenie sieciowe ze zdalnym systemem, gdzie, jeśli jest poprawnie uwierzytelnione, nowe zostanie powłoka, aby wykonać komendę zapisaną jako argument dla ssh lub, jeśli nie podano żadnego argumentu, oczekiwać dalszych poleceń na tym połączeniu.

Ta nowa powłoka zdalna koniecznie będzie powłoką logowania, ponieważ użytkownik zdalny (do tego systemu) musi zostać uwierzytelniony podczas logowania. Lub, jeśli podano określone polecenie, po prostu uruchom je z uprawnieniami uwierzytelnionego użytkownika.

Możesz zobaczyć, które pliki są pobierane, dodając $file sourcedna początku każdego pliku (w systemie zdalnym ) (root jest potrzebny do zmiany /etc/plików):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

A potem po prostu uruchom konsolę ssh:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

W tym przypadku oba bashrcpliki zostały odczytane, ponieważ każdy profileplik zawierał polecenia do ich włączenia, a nie dlatego, że powłoka logowania bezpośrednio je pozyskała.

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

W tym systemie, gdzie bashrcjest czytany w obu przypadkach.

Nie trzeba dodawać a source ~/.bashrcdo polecenia, aby wykonać.

Zmień ŚCIEŻKĘ

Wszystko, co musisz zrobić, to podać prawidłowe ustawienia, aby zmienić „$ PATH” /etc/bash.bashrcdla wszystkich użytkowników, którzy uruchamiają powłokę w tym systemie. Lub ~/.bashrcdla każdego użytkownika, który tego potrzebuje. Możesz dodać (lub edytować) szkielet użytkownika, .bashrcaby /etc/skel/każdy nowy użytkownik mógł utworzyć właściwy plik.

Powyższe dotyczy tylko bash. Jeśli potrzebujesz ustawienia do działania dla wszystkich powłok, prawdopodobnie ustaw zmienną środowiskową PATH za pomocą pliku ssh ~/.ssh/environmentdla każdego użytkownika, który tego potrzebuje. Lub użyj /etc/ssh/sshrcdo ustawienia globalnego w systemie, w którym działa serwer ssh (proszę przeczytać sekcję Pliki, man sshdaby uzyskać dodatkowe informacje).

sorontar
źródło