GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Übergeben von Variablen im Remote-SSH-Befehl

Die Liste der akzeptierten Umgebungsvariablen auf SSHD enthält standardmäßig LC_* . Also:

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3

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 doppelten Anführungszeichen, aber nicht in einfachen Anführungszeichen. Diese ändert sich in Ihre gewünschte Zeichenfolge, bevor sie an ssh übergeben wird Befehl.


Wenn Sie

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

statt

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

Ihre Shell interpoliert die $BUILD_NUMBER bevor die Befehlszeichenfolge an den Remote-Host gesendet wird.


(Diese Antwort mag unnötig kompliziert erscheinen, aber sie ist leicht erweiterbar und robust in Bezug auf Leerzeichen und Sonderzeichen, soweit ich weiß.)

Sie können Daten direkt über die Standardeingabe des ssh eingeben Befehl und read das vom entfernten Standort.

Im folgenden Beispiel

  1. Ein indiziertes Array wird (der Einfachheit halber) mit den Namen der Variablen gefüllt, deren Werte Sie auf der entfernten Seite abrufen möchten.
  2. Für jede dieser Variablen geben wir ssh an eine mit Null abgeschlossene Zeile, die den Namen und Wert der Variablen angibt.
  3. Im shh Befehl 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 export nicht benötigen diese sollten Sie in der Lage sein, declare zu verwenden statt export .

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

$ ssh [email protected] 'read foo' <<< "$foo"

Linux
  1. Ausführen eines Remote-Befehls über eine SSH-Verbindung vor der Anmeldung?

  2. Remote-SSH-Zugriff zulassen?

  3. envsubst:Befehl nicht gefunden

  4. Bash lädt Knoten nicht auf Remote-SSH-Befehl

  5. So führen Sie den ssh-Befehl einen sudo-Befehl ohne Passwort aus der Ferne aus

SSH-Befehl

Was ist ein SSH-Befehl und wie wird SSH verwendet, um eine Verbindung zum Remote-Server herzustellen?

So übergeben Sie das Passwort an den SSH-Befehl in Linux

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server herzustellen

Verwendung von SSH-Befehlen in Linux/Unix-Systemen

Gewusst wie:FreeBSD-Fernverwaltung