Mam użytkownika, który nie wprowadził żadnych zmian do zmiennej $ PATH w żadnym pliku kropkowym: jest to dokładnie domyślne ustawienie systemowe. Z powłoki logowania:
$ ssh example.com
user@example.com:~$ cat /tmp/hello.hs
#!/bin/bash
echo "$SHELL"
echo "$PATH"
user@example.com:~$ /tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin
Dokładnie jak określono w /etc/profile
. To wydaje mi się raczej nieoczekiwane:
$ ssh example.com '/tmp/hello.sh'
/bin/bash
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
Tak jak powiedziałem, nie ma modyfikacji $ PATH w ~/.bashrc
, ani w /etc/bash.bashrc
. Nie ~/.ssh/environment
albo. ssh(1)
Deklaruje, że zmienna PATH
jest
Ustaw domyślną ŚCIEŻKĘ, określoną podczas kompilacji ssh.
ale ten wątek z StackOverflow i ten artykuł z listy mailingowej sugerują, że powinienem mieć wpływ na $ PATH dla danego polecenia, po prostu modyfikując / etc / profile, jeden z plików startowych powłoki itp.
Co tu się dzieje?
.bashrc
może działać, ale ogólnie obejdę to, jeśli ŚCIEŻKA jest ważna. A może po prostu podać pełne nazwy ścieżek, jeśli potrzebujesz metody polecenia ssh? :)bash(1)
INWOKACJA sugeruje, że żadne pliki startowe są odczytywane w ten sposób, ale nie mogę znaleźć dokumentację na temat jak ssh wywołując powłokę. Wydaje się to sprzeczne z powyższymi połączonymi źródłami, chyba że inni mają źródła plików startowych / etc / ssh / sshrc, których nie mam. (Oczywiście istnieją obejścia, ale chodzi o to, aby zrozumieć, jak Debian SSHD domyślnie obsługuje ścieżki.)/etc/profile
moich zdalnych aktualizacjach ścieżki do skrzynki,ssh user@remotebox 'env'
pokaże mi zaktualizowaną ŚCIEŻKĘ. To samo dzieje się, jeśli dodamexport PATH=$PATH:/my/testpath
do .bashrc (ale w moim przypadku na górze pliku przed sprawdzeniem interaktywnych powłok (-z "$PS1"
).Byłem w stanie uzyskać ssh do uruchamiania poleceń przy użyciu ścieżki zdalnej, uruchamiając:
Tutaj env można zastąpić dowolnym poleceniem.
Mam autoryzowane klucze, więc nie potrzebowałem hasła, aby uruchomić polecenie lub ssh.
źródło
Wymyśliłem inne rozwiązanie, aby rozwiązać problem. Moje osobiste preferencje to tworzenie nowych plików konfiguracyjnych zamiast zmieniania istniejących. W ten sposób mogę łatwiej zrezygnować ze zmian z domyślnej konfiguracji.
Oto zawartość
/etc/profile.d/ssh_login.sh
:Używając
dropbear
zamiastopenssh-server
(powinno to również działać z openssh), zmienna SSH_CONNECTION jest ustawiana automatycznie, gdy loguję się zdalnie. Utworzyłem nową konfigurację profilu powłoki, aby wykrywać logowania SSH, wyświetlać pewne informacje na ekranie i, co najważniejsze, ładować globalne ustawienia środowiska,/etc/environment
aby zastąpić skompilowane wartości. Pamiętaj, że dotyczy to tylko interaktywnych powłok SSH, a nie zdalnego wykonywania poleceń.Alternatywnie , jeśli używasz openssh i zawsze chcesz załadować środowisko globalne, niezależnie od tego, czy jest to powłoka interaktywna, możesz umieścić dowiązanie symboliczne w
~/.ssh/
następujący sposób:Następnie musisz włączyć tę
PermitUserEnvironment
opcję w/etc/sshd/sshd_config
. Rób to jednak tylko dla zaufanych użytkowników, ponieważ może to umożliwić im ominięcie ograniczeń dostępu w niektórych konfiguracjach za pomocą mechanizmów takich jak LD_PRELOAD. Zobaczman sshd_config
więcej informacji, w szczególności jak używaćMatch
bloków w celu ograniczenia opcji dla określonych użytkowników / grup.źródło
Jeśli chcesz załadować ścieżkę profilu, spróbuj:
u góry skryptu. W ten sposób powłoka działa w trybie interaktywnym podczas uruchamiania skryptu.
http://linux.die.net/man/1/bash
źródło