Warum ein SSH-Remote-Befehl erhält dann weniger Umgebungsvariablen, wenn sie manuell ausgeführt werden? [geschlossen]
-
03-07-2019 - |
Frage
Ich habe einen Befehl, der fein läuft, wenn ich auf eine Maschine ssh und führen Sie es, aber nicht, wenn ich versuche, es zu laufen mit einem Remote-Befehl ssh wie:
ssh user@IP <command>
Beim Vergleich der Ausgabe von „env“ beide Methoden resutls in verschiedenen Umgebungen. Wenn ich manuell an die Maschine anmelden und env laufen ließe, erhalte ich dann mehr Umwelt viele Variablen, wenn ich laufe:
ssh user@IP "env"
Jede Idee, warum?
Lösung
Es gibt verschiedene Arten von Muscheln. Die SSH-Befehlsausführung Shell ist ein nicht-interaktiv Shell, während Ihre normale Shell ist entweder ein Login-Shell oder eine interaktive Shell. Beschreibung folgt, aus man bash:
A login shell is one whose first character of argument zero is a -, or one started with the --login option. An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state. The following paragraphs describe how bash executes its startup files. If any of the files exist but cannot be read, bash reports an error. Tildes are expanded in file names as described below under Tilde Expansion in the EXPANSION section. When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behav ior. When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists. When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc. When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi but the value of the PATH variable is not used to search for the file name.
Andere Tipps
Wie wäre es das Profil Sourcing, bevor der Befehl ausgeführt wird?
ssh user@host "source /etc/profile; /path/script.sh"
Sie könnte es am besten finden, dass zu ~/.bash_profile
zu ändern, ~/.bashrc
, oder was auch immer.
(wie hier (linuxquestions.org) )
Shell-Umgebung nicht geladen, wenn Remote-Befehl ssh ausgeführt wird. Sie können ssh Umgebungs-Datei bearbeiten:
vi ~/.ssh/environment
Das Format ist:
VAR1=VALUE1
VAR2=VALUE2
Überprüfen Sie auch sshd Konfiguration für PermitUserEnvironment = yes Option.
Ich hatte ähnliches Problem, aber am Ende fand ich heraus, dass ~ / .bashrc alles war ich brauchte.
Doch in Ubuntu, ich hatte die Linie zu kommentieren, die Verarbeitung stoppt ~ / .bashrc:
#If not running interactively, don't do anything
[ -z "$PS1" ] && return
fand ich eine einfache Lösung für dieses Problem hinzufügen war Quelle / etc / profile an die Spitze der script.sh Datei Ich habe versucht, auf dem Zielsystem ausgeführt werden. Auf den Systemen hier, verursachte dies die Umgebungsvariablen, die von script.sh benötigt wurden, konfiguriert werden, wie aus einem Login-Shell ausgeführt wird.
In einem der früheren Antworten wurde vorgeschlagen, dass ~ / .bashr_profile etc ... verwendet werden. Ich habe nicht viel Zeit auf das, aber das Problem dabei ist, wenn Sie zu einem anderen Benutzer auf dem Zielsystem als die Schale auf dem Quellsystem ssh, von dem Sie sich einloggen schien es mir, dass dies das Quellsystem Benutzer verursacht Namen für die ~ verwendet werden.
Exportieren Sie die Umgebungsvariablen über dem Scheck für eine nicht-interaktive Shell wollen in ~ / .bashrc.