Mam polecenie, które działa poprawnie, jeśli ssh na maszynie i uruchomię go, ale kończy się niepowodzeniem, gdy próbuję uruchomić go za pomocą zdalnego polecenia ssh, takiego jak:
ssh user@IP <command>
Porównywanie danych wyjściowych „env” przy użyciu obu metod rozpoczyna się w różnych środowiskach. Kiedy ręcznie loguję się do komputera i uruchamiam env, otrzymuję znacznie więcej zmiennych środowiskowych niż wtedy, gdy uruchamiam:
ssh user@IP "env"
Masz pomysł, dlaczego?
ssh
environment-variables
Tom Feiner
źródło
źródło
bash
nie jest językiem skryptowym?Odpowiedzi:
Istnieją różne rodzaje muszli. Powłoka wykonania polecenia SSH jest powłoką nieinteraktywną, podczas gdy normalna powłoka jest powłoką logowania lub powłoką interaktywną. Opis pochodzi z man bash:
źródło
ssh user@host "bash --login -c 'command arg1 ...'"
zdalna powłoka skonfiguruje środowisko logowania. W cytowanej części wspomina się,--login
ale łatwo byłoby to przeoczyć.ssh <ssh options> <IP> bash --login my_script.sh
uruchamiałem skrypt na zdalnej maszynie, działa uczta i umożliwiłem mi skuteczne korzystanie z lokalnych zmiennych env, takich jakJAVA_HOME
Co powiesz na pozyskanie profilu przed uruchomieniem polecenia?
ssh user@host "source /etc/profile; /path/script.sh"
Może się okazać, że najlepiej to zmienić, aby
~/.bash_profile
,~/.bashrc
czy cokolwiek innego.(Jak tutaj (linuxquestions.org) )
źródło
Środowisko powłoki nie ładuje się podczas uruchamiania zdalnego polecenia ssh. Możesz edytować plik środowiska ssh:
Jego format to:
Sprawdź także
sshd
konfiguracjęPermitUserEnvironment=yes
opcji.źródło
Miałem podobny problem, ale w końcu dowiedziałem się, że ~ / .bashrc było wszystkim, czego potrzebowałem.
Jednak w Ubuntu musiałem skomentować linię, która przestaje przetwarzać ~ / .bashrc:
źródło
/etc/bash.bashrc
.Odkryłem, że łatwym rozwiązaniem tego problemu było dodanie źródła / etc / profile na górze pliku script.sh, który próbowałem uruchomić w systemie docelowym. W systemach tutaj spowodowało to, że zmienne środowiskowe potrzebne skryptowi.sh zostały skonfigurowane tak, jakby działały z powłoki logowania.
W jednej z wcześniejszych odpowiedzi zasugerowano użycie ~ / .bashr_profile itp ... Nie spędziłem dużo czasu na tym, ale problem polega na tym, że ssh do innego użytkownika w systemie docelowym niż powłoka w systemie źródłowym, z którego się logujesz, wydaje mi się, że powoduje to użytkownika systemu źródłowego nazwa używana dla ~.
źródło
Po prostu wyeksportuj zmienne środowiskowe, które chcesz powyżej sprawdzania nieinteraktywnej powłoki w ~ / .bashrc.
źródło