Ich möchte in der Lage sein, einen Befehl von meinem Computer mit ssh auszuführen und die Umgebungsvariable zu übergeben $BUILD_NUMBER
Folgendes versuche ich:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
wird auf dem Computer festgelegt, der den SSH-Aufruf ausführt, und da die Variable auf dem Remote-Host nicht vorhanden ist, wird sie nicht erfasst.
Wie übergebe ich den Wert von $BUILD_NUMBER
?
Antworten:
Wenn du benutzt
anstatt
Ihre Shell interpoliert die
$BUILD_NUMBER
vor dem Senden der Befehlszeichenfolge an den Remote-Host.quelle
Variablen in einfachen Anführungszeichen werden nicht ausgewertet. Verwenden Sie doppelte Anführungszeichen:
Die Shell erweitert Variablen in doppelten Anführungszeichen, jedoch nicht in einfachen Anführungszeichen. Dies ändert sich in die gewünschte Zeichenfolge, bevor sie an den
ssh
Befehl übergeben wird.quelle
(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
ssh
Befehls undread
die vom Remote-Standort aus eingeben.Im folgenden Beispiel
ssh
eine nullterminierte Zeile an, die den Namen und den Wert der Variablen angibt.shh
Befehl selbst durchlaufen wir diese Zeilen, um die erforderlichen Variablen zu initialisieren.Ausgabe:
Wenn Sie diese nicht benötigen
export
, sollten Sie siedeclare
anstelle von verwenden könnenexport
.Eine wirklich vereinfachte Version (wenn Sie die Erweiterbarkeit nicht benötigen, eine einzelne Variable verarbeiten müssen usw.) würde folgendermaßen aussehen:
quelle
Die Liste der akzeptierten Umgebungsvariablen auf SSHD enthält standardmäßig
LC_*
. So:quelle
Wie bereits beantwortet, müssen Sie die Umgebungsvariable nicht auf dem Remote-Host festlegen. Stattdessen können Sie einfach die Metaerweiterung auf dem lokalen Host durchführen und den Wert an den Remote-Host übergeben.
Wenn Sie die Umgebungsvariable wirklich auf dem Remote-Host festlegen und verwenden möchten, können Sie das
env
Programm verwendenIn diesem Fall ist dies ein bisschen übertrieben, und beachten Sie
env BUILD_NUMBER=$BUILD_NUMBER
führt die Metaerweiterung auf dem lokalen Host durchBUILD_NUMBER
Umgebungsvariable wird vonder Remote-Shell verwendet
quelle
Es ist auch möglich, Umgebungsvariablen explizit über ssh zu übergeben. Es erfordert einige serverseitige Einstellungen, daher ist dies keine universelle Antwort.
In meinem Fall wollte ich einen Sicherungsrepository-Verschlüsselungsschlüssel an einen Befehl auf dem Sicherungsspeicherserver übergeben, ohne dass dieser Schlüssel dort gespeichert ist. Beachten Sie jedoch, dass alle Umgebungsvariablen in sichtbar sind
ps
! Die Lösung, den Schlüssel an stdin weiterzugeben, würde ebenfalls funktionieren, aber ich fand es zu umständlich. In jedem Fall erfahren Sie hier, wie Sie eine Umgebungsvariable über ssh übergeben:Bearbeiten Sie die
sshd_config
Datei normalerweise auf dem Server/etc/ssh/sshd_config
und fügen Sie eineAcceptEnv
Direktive hinzu, die den Variablen entspricht, die Sie übergeben möchten. Sieheman sshd_config
. In meinem Fall möchte ich Variablen an borg backup übergeben, also habe ich gewählt:Verwenden Sie jetzt auf dem Client die
-o SendEnv
Option, um Umgebungsvariablen zu senden. Die folgende Befehlszeile legt die Umgebungsvariable festBORG_SECRET
und markiert sie dann zum Senden an den Clientcomputer (aufgerufenbackup
). Dort wird es dann ausgeführtprintenv
und die Ausgabe nach BORG-Variablen gefiltert:quelle
LC_*
zulässigen zu sendenden Variablen enthält. Verwenden Sie also einfach$LC_TvE_foo
oder$LC_BORG_SECRET
stellen Sie sicher, dass Sie nicht mit einer integrierten Variablen "kollidieren".Escape die Variable, um auf Variablen außerhalb der ssh-Sitzung zuzugreifen: ssh [email protected] "~ / tools / myScript.pl \ $ BUILD_NUMBER"
quelle
'$FOO'
ist äquivalent zu"\$FOO"
. Die Frage war "Wie übergebe ich eine Shell-Variable mit SSH?". Wie bereits von @PatrickTrentin angegeben, ist dies keine korrekte Antwort, da dann dieBUILD_NUMBER
Umgebungsvariable nicht remote festgelegt wird.