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
?
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.
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.
(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
ssh
eine nullterminierte Zeile mit dem Namen und Wert der Variablen.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"
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 durchBUILD_NUMBER
-Umgebungsvariable wird von verwendet