So führen Sie einen mehrzeiligen SSH-Befehl aus, der in einer Variablen gespeichert ist

So führen Sie einen mehrzeiligen SSH-Befehl aus, der in einer Variablen gespeichert ist

Kontext: Ich versuche, eine Reihe von Befehlen auf einem Remotecomputer auszuführen, auf den ich nicht direkt zugreifen kann. Ich muss mich zuerst per SSH bei einem Gatewaycomputer anmelden und dann von dort aus per SSH die Befehle ausführen.

Im Grunde suche ich nach einer Möglichkeit, eine Reihe von Befehlen zu bündeln, die ich über eine beliebige Anzahl von SSH-Ebenen weitergeben kann. Ist das möglich? Ich vermute, die beste Lösung besteht darin, mit SCP ein Skript zu kopieren und es dann auszuführen. Das ist eine Option.

Beachten Sie, dass ich den Hostnamen-Befehl verwendet habe, um anzuzeigen, was vor sich geht – das ist nicht, was ich wirklich tun möchte!

Beginnen wir mit einem Befehl, der ein einzelnes SSH ausführt und dort einen mehrzeiligen Befehlssatz ausführt:

ssh gateway.my.company "
  hostname;
  hostname;
"

Das funktioniert einwandfrei. Die Ausgabe sieht ungefähr so ​​aus:

target_machine
target_machine

Anschließend habe ich den Befehlssatz in einer Variablen gespeichert und diese übergeben:

command="
  hostname;
  hostname;
"
ssh gateway.my.company $command

Die Ausgabe ist genau dieselbe – beide hostnameBefehle werden auf dem Ziel ausgeführt.

Als nächstes füge ich den zusätzlichen SSH-Hop (zur privaten Maschine) hinzu:

ssh gateway.my.company ssh target_machine_ip $command

Dieses Mal hostnamewerden die beiden Befehle auf unterschiedlichen Maschinen ausgeführt:

target_machine
gateway_machine

Es scheint, dass ich diesen Schritt lösen kann, indem ich den Befehl in Anführungszeichen setze (also \"$command\"), aber wenn ich das tue, muss ich ihn für den direkten Fall anders umschließen, da dies ssh gateway.my.company \"$command\"nicht mehr funktioniert.

HINWEIS: Mir ist bewusst, dass Befehle nicht in einer Variablen, sondern in einer Funktion gespeichert werden sollten, da ich jedoch SSH verwende, würde jede von mir deklarierte Funktion nicht mehr existieren, sobald ich mich per SSH mit dem nächsten Server verbunden habe.

BEARBEITEN: In der ursprünglichen Frage wurde der zweite Hop ausgelassen, tut mir leid!

Antwort1

es fehlen nur noch ein paar Zitate:

ssh gateway.my.company "$command"

verwandte Informationen