Angenommen, auf einem meiner PCs läuft eine Anwendung, die Befehle über SSH an einen anderen PC im Netzwerk sendet (auf beiden Rechnern läuft Linux).
Beispielsweise möchte ich jedes Mal, wenn bei #1 etwas passiert, eine Aufgabe bei #2 ausführen. In diesem Setup muss ich bei jedem einzelnen Befehl eine SSH-Verbindung herstellen.
Gibt es eine einfache Möglichkeit, dies mit grundlegenden Unix-Tools zu tun, ohne eine benutzerdefinierte Client/Server-Anwendung zu programmieren? Im Grunde möchte ich nur eine Verbindung über SSH herstellen und dann einen Befehl nach dem anderen senden.
Antwort1
Ich bin nicht sicher, ob es in der Produktion verwendet werden kann, aber Sie können so etwas tun:
Datei erstellen auf #1
1>touch /tmp/commands
Führen Sie dann den folgenden Befehl aus:
1>tail -f /tmp/commands | ssh [email protected]
Dadurch wird die Datei /tmp/commands geöffnet und ihr Inhalt an den Server xxxx (#2) gesendet und dort Zeile für Zeile ausgeführt.
Jetzt, jedes Mal wenn bei #1 etwas passiert, tun Sie Folgendes:
1>echo "ls -l" >> /tmp/commands
oder
1>echo "reboot" >> /tmp/commands
alles, was Sie zur Datei /tmp/commands hinzufügen, wird an #2 gesendet und ausgeführt. Stellen Sie einfach sicher, dass Sie nichts Interaktives ausführen, oder behandeln Sie es irgendwie.
Antwort2
Automatische Persistenz mit OpenSSH
ControlMaster
Sie können auch die Funktion von OpenSSH nutzen , das für die erste Verbindung einen Unix-Domain-Socket öffnet und diese Verbindung bei allen nachfolgenden Aufrufen wiederverwendet.
Um die Funktion zu aktivieren, können Sie entweder -M
den Befehlszeilenschalter verwenden oder die ControlMaster
Option in Ihrem aktivieren ~/.ssh/ssh_config
, zum Beispiel:
ControlMaster auto
Zusätzlich sollten Sie ControlPath
die folgenden Zeilen in Ihrem festlegen ~/.ssh/ssh_config
:
Host *
ControlPath ~/.ssh/master-%r@%h:%p
Um eine dauerhafte Verbindung zu einem Host aufrechtzuerhalten, z. B. wenn Sie ein Skript ausführen möchten, das viele SSH-Verbindungen zum Host herstellen muss, von denen keine über die gesamte Lebensdauer des Skripts bestehen bleibt, können Sie vorab eine stille Verbindung starten, indem Sie Folgendes verwenden:
ssh -MNf remotehost
Tschüß, nesono
Antwort3
Im /etc/ssh/ssh_config
Add
# Send keep alive signal to remote sshd
ServerAliveInterval 60
Antwort4
ja, mit einer Pipe ist das möglich:
echo 'echo "hi"' | ssh -i my_private_key tester@host2
Dadurch wird der Befehl echo "hi" auf Host2 ausgeführt.
du musst nur ein Programm schreiben, das die Befehle ausgibt (vergesse das ; nicht) und diese Ausgabe dann an ssh weiterleitet