it-swarm.com.de

Warum erhält ein SSH-Remote-Befehl weniger Umgebungsvariablen als wenn er manuell ausgeführt wird?

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 entfernten ssh-Befehl auszuführen, wie z.

ssh [email protected] <command>

Der Vergleich der Ausgabe von "env" mit beiden Methoden wird in verschiedenen Umgebungen durchgeführt. Wenn ich mich manuell auf dem Computer anmelde und env ausführe, erhalte ich viel mehr Umgebungsvariablen als beim Ausführen von:

ssh [email protected] "env"

Irgendeine Idee warum?

221
Tom Feiner

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. Die Beschreibung folgt aus man bash:

 Eine Login-Shell ist eine Shell, deren erstes Argumentzeichen 
 Null ein - ist, oder eine Shell, die mit der Option --login gestartet wurde. 
 
 Eine interaktive Shell ist eine Eins gestartet ohne Argumente ohne Option 
 und ohne die Option -c, deren Standardeingabe 
 und Fehler beide mit Terminals verbunden sind (wie durch isatty (3) bestimmt 
), oder gestartet mit der Option -i. PS1 ist 
 Gesetzt und $ - enthält i, wenn bash interaktiv ist, sodass ein 
 Shell-Skript oder eine Startdatei diesen Status testen kann. 
 
 In den folgenden Absätzen wird beschrieben wie bash seine 
 Startdateien ausführt. Wenn eine der Dateien existiert, aber nicht 
 Gelesen werden kann, meldet bash einen Fehler. Tildes werden in den Dateinamen 
 Wie unten unter Tilde Expansion im Abschnitt 
 EXPANSION beschrieben erweitert. 
 
 Wenn bash als interaktive Anmeldeshell oder als 
 eine nicht interaktive Shell mit der Option --login, liest sie zuerst 
 Befehle aus der Datei/etc/profile und führt sie aus, wenn 
 diese Datei existiert. Nach dem Lesen dieser Datei wird nach 
 ~/.Bash_profile, ~/.bash_login und ~/.profile in dieser 
 Reihenfolge gesucht und Befehle von der ersten Datei gelesen und ausgeführt 
 das existiert und lesbar ist. Die Option --noprofile kann 
 Verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu unterbinden 
 Oder 
 
 Wenn eine Anmeldeshell beendet wird, liest bash Befehle und führt sie aus 
 aus der Datei ~/.bash_logout, falls vorhanden. 
 
 Wenn eine interaktive Shell, die keine Anmeldeshell ist, 
 gestartet wird, liest bash Befehle und führt sie aus von ~/.bashrc, 
 falls diese Datei existiert. Dies kann durch Verwendung der Option 
 --Norc verhindert werden. Die Option --rcfile file zwingt bash 
 Zum Lesen und Ausführen von Befehlen aus der Datei anstelle von 
 ~/.Bashrc. 
 
 Wenn bash nicht interaktiv gestartet wird Um beispielsweise ein Shell-Skript 
 auszuführen, sucht es in 
 der Umgebung nach der Variablen BASH_ENV, erweitert ihren Wert, wenn sie dort angezeigt wird, 
 und verwendet den erweiterten Wert als Name einer Datei, die gelesen 
 und ausgeführt werden soll. Bash verhält sich so, als ob der folgende Befehl 
 Ausgeführt wurde: 
 If [-n "$ BASH_ENV"]; dann . "$ BASH_ENV"; fi 
, aber der Wert der PATH-Variablen wird nicht verwendet, um 
 nach dem Dateinamen zu suchen. 
 
159
Vinko Vrsalovic

Wie wäre es, das Profil zu finden, bevor Sie den Befehl ausführen?

ssh [email protected] "source /etc/profile; /path/script.sh"

Am besten ändern Sie dies in ~/.bash_profile, ~/.bashrc, oder Wasauchimmer.

(As hier (linuxquestions.org) )

112
Ian Vaughan

Die Shell-Umgebung wird beim Ausführen des Remote-Befehls ssh nicht geladen. Sie können die SSH-Umgebungsdatei bearbeiten:

vi ~/.ssh/environment

Sein Format ist:

VAR1=VALUE1
VAR2=VALUE2

Überprüfen Sie auch die sshd-Konfiguration für die Option PermitUserEnvironment = yes.

83
dpedro

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, in der ~/.bashrc nicht mehr verarbeitet wird:

#If not running interactively, don't do anything
[ -z "$PS1" ] && return
60
tomaszbak

Ich fand eine einfache Lösung für dieses Problem, indem ich die Quelldatei/etc/profile oben in die Datei script.sh einfügte, die ich auf dem Zielsystem ausführen wollte. Auf den hier beschriebenen Systemen wurden die Umgebungsvariablen, die script.sh benötigte, 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, dass Sie einen anderen Benutzer auf dem Zielsystem als die Shell auf dem Quellsystem, von dem aus Sie sich anmelden, als Benutzer des Quellsystems angeben Name, der für das ~ verwendet werden soll.

4
Chuck

Exportieren Sie einfach die gewünschten Umgebungsvariablen über die Prüfung für eine nicht interaktive Shell in ~/.bashrc.

3