it-swarm.com.de

Übergabe von Variablen im Remote-Befehl ssh

Ich möchte in der Lage sein, einen Befehl von meinem Computer aus mit ssh auszuführen und die Umgebungsvariable $BUILD_NUMBER zu übergeben.

Folgendes versuche ich:

ssh [email protected] '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBER ist auf dem Rechner eingestellt, der den ssh-Aufruf ausführt. Da die Variable auf dem fernen Host nicht vorhanden ist, wird sie nicht abgerufen.

Wie gebe ich den Wert von $BUILD_NUMBER?

72
Fergal

Wenn du benutzt

ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"

anstatt

ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'

ihre Shell interpoliert den $BUILD_NUMBER, bevor Sie die Befehlszeichenfolge an den Remote-Host senden.

140
sarnold

Variablen in einfachen Anführungszeichen werden nicht ausgewertet. Verwenden Sie doppelte Anführungszeichen:

ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"

Die Shell erweitert Variablen in doppelte Anführungszeichen, jedoch nicht in einfache Anführungszeichen. Dies ändert sich in die gewünschte Zeichenfolge, bevor es an den Befehl ssh übergeben wird.

25
Stephen

(Diese Antwort mag unnötig kompliziert erscheinen, ist aber meines Wissens leicht erweiterbar und robust in Bezug auf Leerzeichen und Sonderzeichen.

Sie können Daten direkt über die Standardeingabe des Befehls ssh und des Befehls read vom fernen Standort aus übertragen.

Im folgenden Beispiel

  1. ein indiziertes Array wird (der Einfachheit halber) mit den Namen der Variablen gefüllt, deren Werte Sie auf der Remote-Seite abrufen möchten.
  2. Für jede dieser Variablen geben wir ssh eine nullterminierte Zeile mit dem Namen und Wert der Variablen.
  3. Im Befehl shh selbst durchlaufen wir diese Zeilen, um die erforderlichen Variablen zu initialisieren.
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb

# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
    FOO
    BAR
)

for name in "${VAR_NAMES[@]}"
do
    printf '%s %s\0' "$name" "${!name}"
done | ssh [email protected] '
    while read -rd '"''"' name value
    do
        export "$name"="$value"
    done

    # Check
    printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'

Ausgabe:

FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]

Wenn Sie diese nicht export benötigen, sollten Sie declare anstelle von export verwenden können.

Eine wirklich vereinfachte Version (wenn Sie die Erweiterbarkeit nicht benötigen, eine einzelne Variable zu verarbeiten haben usw.) würde folgendermaßen aussehen:

$ ssh [email protected] 'read foo' <<< "$foo"
1
Alice M.

Wie bereits erwähnt, müssen Sie die Umgebungsvariable auf dem Remote-Host nicht festlegen. Stattdessen können Sie einfach die Meta-Erweiterung auf dem lokalen Host durchführen und den Wert an den Remote-Host übergeben.

ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'

Wenn Sie die Umgebungsvariable wirklich auf dem Remote-Host festlegen und verwenden möchten, können Sie das Programm env verwenden

ssh [email protected] "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"

In diesem Fall ist dies ein bisschen übertrieben und ein Hinweis

  • env BUILD_NUMBER=$BUILD_NUMBER führt die Meta-Erweiterung auf dem localHost durch
  • die entfernte BUILD_NUMBER-Umgebungsvariable wird von verwendet
    die entfernte Shell
0