So beenden Sie eine SSH-Verbindung in einem Bash-Skript

So beenden Sie eine SSH-Verbindung in einem Bash-Skript

Ich habe hier mehrere Beiträge zu diesem Thema gelesen, aber jede Lösung, die ich finde, scheint ein Einzeiler zu sein, in dem Sie einen Befehl ausführen.

Ich erstelle ein Skript, mit dem ich nacheinander per SSH auf mehrere verschiedene Hosts zugreife. Ziel ist, per SSH auf einen Rechner zuzugreifen, einige lokale Befehle auszuführen, ein Skript auszuführen, zu warten, bis es fertig ist, und dann die SSH-Sitzung zu beenden und mit der nächsten fortzufahren.

Wenn ich jedoch den Befehl „exit“ verwende, funktioniert es nicht und das Skript wird einfach vollständig beendet.

Antwort1

Ich vermute, dass Ihr Skript die Shell-Sitzung nicht beendet, weil Sie es direkt mit aufrufen ./exit.sh. Sie sollten sourcees stattdessen verwenden.

Eine exitAnweisung in Ihrem Skript schließt dann die Shell-Sitzung.

$ source exit.sh
# or
$ . exit.sh

Das sourceintegrierte Programm führt Ihr Skript imaktueller Shell-Kontext, während ./exit.shstartet eineneue Schaleum es auszuführen.

Antwort2

Haben Sie versucht, die Befehle in eine Datei zu packen und damit cat oder EOF zu verwenden?

ssh -t [email protected] << EOF
 command1
 command2
 exit
EOF

Antwort3

Ich empfehle Ihnen, sich psshdas für Ihr Vorhaben anzusehen. Es ermöglicht Ihnen die einfache Handhabung der Nuancen beim Öffnen/Schließen von Verbindungen zwischen Maschinen und kann zur Reduzierung der Ausführungszeit sogar parallel ausgeführt werden.

Es wird immer noch sshals Transportprotokoll verwendet und ist daher offensichtlich genauso sicher wie eine Schleifenverbindung ssh.

https://linux.die.net/man/1/pssh

Antwort4

Eine Schleife lässt sich fordamit meist sshproblemlos durchführen.

$ for srv in 192.168.88.138; do echo $srv:; ssh $srv uptime; done
192.168.88.138:
 13:27:25 up 30 days,  8:42,  1 user,  load average: 4.15, 4.06, 4.06

uptimeIn diesem Fall habe ich also auf der anderen Seite ausgeführt . Sie können uptimedurch das ersetzen, was Sie ausführen möchten. Was auch immer Sie dort eingeben, dort muss der Ausgang sein. uptimewird beendet, sobald die Ausgabe gedruckt wird, aber wenn Sie das Skript schreiben, müssen Sie möglicherweise sicherstellen, dass es irgendwann beendet wird, damit die forSchleife fortgesetzt werden kann.

Wenn Sie etwas Kompliziertes tun, empfehle ich, das Skript in einer separaten Datei zu erstellen und scpes dann an den Server zu senden, auf dem Sie es ausführen möchten. Anschließend können Sie es per SSH ausführen. Der Versuch, etwas Kompliziertes über Anführungszeichen und Escapezeichen in SSH zu bekommen, ist normalerweise schwieriger, als es wert ist.

Ich habe das schon hunderte Male gemacht und es funktioniert gut, wenn man Dinge gleichzeitig auf einem Server laufen lassen möchte. Wenn man Dinge parallel laufen lassen möchte, gibt es andere Optionen, aber ich würde mir folgendes ansehen:Erste.

verwandte Informationen