6 Stimmen

Übergabe von Variablen an ein entferntes Skript über SSH

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"

0voto

ppo Punkte 31

Diese Lösung funktioniert bei mir gut. Angenommen, Sie haben ein Skript, das zwei Parameter oder zwei Variablen benötigt:

#!/bin/sh
echo "local"
echo "$1"
echo "$2"
/usr/bin/ssh root@192.168.1.2 "/path/test.sh \"$1\" \"$2\";"

Und das Skript test.sh auf 192.168.1.2:

#!/bin/bash
echo "remote"
echo "$1"
echo "$2"

Die Ausgabe wird sein:

local
This is first params
And this is second
remote
This is first params
And this is second

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X