Mam kilka ważnych poleceń, które muszę wykonać przed uruchomieniem powłoki sh. Jest to wymagane do przekazywania poleceń SSH w poleceniu SSH ( ssh host somecommand
) i innych programach uruchamiających polecenia.
W mojej .profile
mam to:
ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin
Nie udaje się to jednak:
W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin
Zwróć uwagę na brakujące opcje ŚCIEŻKI
Jaka jest właściwa nazwa dla profilu sh? Uwaga: nie mam dostępu do konta root i nie chcę, aby dotyczyło to innych użytkowników. Czy jest na to inny sposób?
EDYCJA: Wydaje się, że /bin/sh
linki do bash
, co nie jest zaskakujące. Zaskakujące jest to, że mój profil jest nadal ignorowany. Jakieś sugestie?
ssh name@host -t echo $PATH
.Odpowiedzi:
Warto zauważyć, że polecenie, o którym wspominasz w swoim pytaniu
prawie nigdy się nie przyda. Podstawienie zmiennej dla $ PATH jest wykonywane przez lokalną powłokę i przekazywane do ssh, który wykonuje echo w systemie zdalnym, aby wydrukować zawartość zmiennej ścieżki, gdy została ona rozwinięta w systemie lokalnym. Oto przykład, jak robię coś podobnego między moim komputerem Mac a komputerem z systemem Linux w mojej sieci:
Zwróć uwagę, jak musiałem używać cudzysłowów, aby moja lokalna powłoka nie rozwijała zmiennej.
źródło
~/.profile
jest wykonywany tylko przez powłoki logowania. Program, który wywołuje powłokę, decyduje, czy powłoka będzie powłoką logowania (umieszczając-
jako pierwszy znak zerowego argumentu w wywołaniu powłoki). Zwykle nie jest wykonywany, gdy logujesz się, aby wykonać określone polecenie.W szczególności OpenSSH wywołuje powłokę logowania tylko wtedy, gdy nie podano polecenia. Więc jeśli podasz polecenie,
~/.profile
nie zostanie odczytane.OpenSSH pozwala ustawiać zmienne środowiskowe po stronie serwera. To musi być włączone w konfiguracji serwera z
PermitUserEnvironment
dyrektywą. Zmienne można ustawić w pliku~/.ssh/environment
. Zakładając, że korzystasz z uwierzytelniania za pomocą klucza publicznego, możesz również ustawić zmienne dla poszczególnych kluczy w~/.ssh/authorized_keys
: dodajenvironment="FOO=bar"
na początku odpowiedniego wiersza.Ssh obsługuje również wysyłanie zmiennych środowiskowych. W OpenSSH użyj
SendEnv
dyrektywy w~/.ssh/config
. Jednak konkretna zmienna środowiskowa musi być włączona zAcceptEnv
dyrektywą w konfiguracji serwera, więc może to nie zadziałać.Jedną rzeczą, która moim zdaniem zawsze działa (co dziwne), o ile korzystasz z uwierzytelniania za pomocą klucza publicznego, to (ab) użycie
command=
opcji zauthorized_keys
pliku . Klawisz zcommand
opcją nadaje się tylko do uruchomienia określonej komendy; ale polecenie wauthorized_keys
pliku działa ze zmienną środowiskowąSSH_ORIGINAL_COMMAND
ustawioną na polecenie określone przez użytkownika. Ta zmienna jest pusta, jeśli użytkownik nie określił polecenia i dlatego oczekiwał powłoki interaktywnej. Możesz więc użyć czegoś takiego w~/.ssh/authorized_keys
(oczywiście nie będzie to miało zastosowania, jeśli nie użyjesz tego klucza do uwierzytelnienia):Inną możliwością jest napisanie skryptów opakowania na serwerze. Coś takiego jak poniżej
~/bin/ssh-wrapper
:Następnie wykonaj dowiązania symboliczne do tego skryptu o nazwie
rsync
,unison
itd karnetów--rsync-path='bin/rsync'
narsync
linii poleceń, i tak dalej do innych programów. Alternatywnie, niektóre polecenia umożliwiają określenie całego fragmentu powłoki, który ma być uruchamiany zdalnie, co pozwala na samodzielne wykonanie polecenia: na przykład możesz użyć rsync--rsync-path='. ~/.profile; rsync'
.Istnieje inna droga, która zależy od tego, czy twoja powłoka logowania jest bash lub zsh. Bash zawsze czyta,
~/.bashrc
gdy jest wywoływany przez rshd lub sshd, nawet jeśli nie jest interaktywny (ale nie, jeśli jest wywoływany jakosh
). Zsh zawsze czyta~/.zshenv
.źródło
command=
wauthorized_keys
) działa w sposób przejrzysty. Inne wymagają określonej powłoki lub opcji w konfiguracji serwera ssh. Odpowiednikiem rtęciowym--rsync-path
jest--remotecmd
.command=
polecenie, jak w swoim poście superuser.com/a/207262/137762Zwykle po zalogowaniu bash czyta polecenia z:
~ / .bash_profile
~ / .bashrc
Ze strony podręcznika użytkownika bash:
źródło
Nie mam czasu na przetestowanie tego, ale przeglądając strony podręcznika, które znalazłem:
man bash: Gdy bash jest uruchamiany nieinteraktywnie, aby na przykład uruchomić skrypt powłoki, szuka w środowisku zmiennej BASH_ENV, rozwija swoją wartość, jeśli się tam pojawia, i używa wartości rozwiniętej jako nazwy pliku przeczytaj i wykonaj. Bash zachowuje się tak, jakby wykonano następujące polecenie: if [-n "$ BASH_ENV"]; następnie . „$ BASH_ENV”; fi, ale wartość zmiennej PATH nie jest używana do wyszukiwania nazwy pliku.
man ssh: ~ / .ssh / environment Zawiera dodatkowe definicje zmiennych środowiskowych; patrz ŚRODOWISKO powyżej.
Ta kombinacja sugeruje, jak możesz ssh wykonać .profile
Niestety mój serwer ma PermitUserEnvironment do domyślnej wartości no, co sprawia, że to nie działa dla mnie (i jak powiedziałem, nie mam czasu na zabawę z tym więcej).
źródło
(usunięty ... może mieć tylko jedno hiperłącze jako nowy użytkownik ~)
Aktualizacja
Przepraszam, nie widziałem, że chodzi o sesję nieinteraktywną, do której powyższy link nie ma zastosowania.
Pytanie brzmi: dlaczego go nie wykonuje, mimo że twoja powłoka jest uruchomiona w ten sposób?
Źródło
źródło