Warum ein SSH-Remote-Befehl erhält dann weniger Umgebungsvariablen, wenn sie manuell ausgeführt werden? [geschlossen]

StackOverflow https://stackoverflow.com/questions/216202

  •  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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top