Ich führe Skripte auf einem Remote-Server von einem lokalen Server aus über SSH aus. Das Skript wird zunächst über SCP kopiert und dann aufgerufen, wobei einige Argumente wie folgt übergeben werden:
scp /path/to/script server.example.org:/another/path/
ssh server.example.org \
MYVAR1=1 \
MYVAR2=2 \
/another/path/script
Dies funktioniert gut und auf dem entfernten Server werden die Variablen MYVAR1
y MYVAR2
sind mit ihrem entsprechenden Wert verfügbar.
Das Problem ist, dass diese Skripte ständig weiterentwickelt werden, so dass der SSH-Befehl jedes Mal geändert werden muss, wenn eine Variable umbenannt, hinzugefügt oder entfernt wird.
Ich suche nach einer Möglichkeit, alle lokalen Umgebungsvariablen an das entfernte Skript zu übergeben (da MYVAR1
y MYVAR2
sind eigentlich lokale Umgebungsvariablen), was das Problem der SSH-Befehlswartung lösen würde.
Seit MYVAR1=1 \
y MYVAR1=1 \
sind Linien, die dem env
Befehlsausgabe habe ich versucht, sie wie folgt durch den eigentlichen Befehl zu ersetzen:
ssh server.example.org \
`env`
/another/path/script
Dies scheint bei "einfachen" Fällen zu funktionieren. env
Ausgabezeilen (z.B. SHELL=/bin/bash
o LOGNAME=sysadmin
), aber ich erhalte Fehler für mehr "c LS_COLORS=rs=0:di=01;34:ln=01;[...]
was zu Fehlern wie den folgenden führt -bash: 34:ln=01: command not found
). Ich kann diese Fehler loswerden, indem ich die Variablen, die diesen komplexen Ausgabezeilen entsprechen, vor dem Ausführen des SSH-Befehls entferne (z. B. unset LS_COLORS
entonces ssh [...]
), aber ich halte diese Lösung nicht für sehr zuverlässig.
F: Weiß jemand, wie man alle lokalen Umgebungsvariablen über SSH an ein entferntes Skript weitergibt?
PS: Die lokalen Umgebungsvariablen sind keine Umgebungsvariablen, die auf dem entfernten Rechner verfügbar sind. daher kann ich diese Lösung nicht verwenden .
Update mit Lösung
Ich benutzte schließlich sed
zum Formatieren der env
Befehlsausgabe von VAR=VALUE
a VAR="VALUE"
(und die Verkettung aller Zeilen zu 1), was verhindert, dass die Bash einige der Ausgaben als Befehle interpretiert und mein Problem behebt.
ssh server.example.org \
`env | sed 's/\([^=]*\)=\(.*\)/\1="\2"/' | tr '\n' ' '` \
"/another/path/script"