Ich habe einen Befehl, der einwandfrei ausgeführt wird, wenn ich ssh auf einem Computer ausführe und ihn ausführe, der jedoch fehlschlägt, wenn ich versuche, ihn mit einem Remote-ssh-Befehl wie dem folgenden auszuführen:
ssh user@IP <command>
Der Vergleich der Ausgabe von "env" mit beiden Methoden wird in verschiedenen Umgebungen erneut ausgeführt. Wenn ich mich manuell am Computer anmelde und env ausführe, erhalte ich viel mehr Umgebungsvariablen als beim Ausführen von:
ssh user@IP "env"
Irgendeine Idee warum?
ssh
environment-variables
Tom Feiner
quelle
quelle
bash
ist keine Skriptsprache?Antworten:
Es gibt verschiedene Arten von Muscheln. Die SSH-Befehlsausführungsshell ist eine nicht interaktive Shell, während Ihre normale Shell entweder eine Anmeldeshell oder eine interaktive Shell ist. Beschreibung folgt aus Man Bash:
quelle
ssh user@host "bash --login -c 'command arg1 ...'"
dass die Remote-Shell die Anmeldeumgebung einrichtet. Der Abschnitt, den Sie zitiert haben, erwähnt zwar,--login
aber es wäre leicht, dies zu übersehen.ssh <ssh options> <IP> bash --login my_script.sh
ein Skript auf dem Remotecomputer ausgeführt, eineJAVA_HOME
Wie wäre es mit der Beschaffung des Profils, bevor Sie den Befehl ausführen?
ssh user@host "source /etc/profile; /path/script.sh"
Vielleicht haben Sie es am besten zu ändern finden , dass zu
~/.bash_profile
,~/.bashrc
oder was auch immer.(Wie hier (linuxquestions.org) )
quelle
Die Shell-Umgebung wird beim Ausführen des Remote-Befehls ssh nicht geladen. Sie können die SSH-Umgebungsdatei bearbeiten:
Sein Format ist:
Überprüfen Sie auch die
sshd
Konfiguration aufPermitUserEnvironment=yes
Option.quelle
Ich hatte ein ähnliches Problem, aber am Ende fand ich heraus, dass ~ / .bashrc alles war, was ich brauchte.
In Ubuntu musste ich jedoch die Zeile kommentieren, die die Verarbeitung von ~ / .bashrc beendet:
quelle
/etc/bash.bashrc
.Ich fand eine einfache Lösung für dieses Problem darin, Quelle / etc / profile oben in der Datei script.sh hinzuzufügen, die ich auf dem Zielsystem ausführen wollte. Auf den Systemen hier wurden die Umgebungsvariablen, die von script.sh benötigt wurden, so konfiguriert, als würden sie von einer Anmeldeshell ausgeführt.
In einer der vorherigen Antworten wurde vorgeschlagen, ~ / .bashr_profile etc ... zu verwenden. Ich habe nicht viel Zeit damit verbracht, aber das Problem dabei ist, wenn Sie einem anderen Benutzer auf dem Zielsystem als der Shell auf dem Quellsystem, von dem aus Sie sich anmelden, einen SSH senden. Es scheint mir, dass dies den Benutzer des Quellsystems verursacht Name, der für das ~ verwendet werden soll.
quelle
Exportieren Sie einfach die gewünschten Umgebungsvariablen über die Prüfung für eine nicht interaktive Shell in ~ / .bashrc.
quelle