Angenommen, auf einem PC wird eine Anwendung ausgeführt, die Befehle über SSH an einen anderen PC im Netzwerk sendet (beide Computer laufen unter Linux).
Zum Beispiel möchte ich jedes Mal, wenn etwas auf # 1 passiert, eine Aufgabe auf # 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? Grundsätzlich möchte ich nur eine Verbindung über SSH herstellen und dann einen Befehl nach dem anderen senden.
Antworten:
Sie sind sich nicht sicher, ob es in der Produktion verwendet werden kann, aber Sie können Folgendes tun:
Datei auf # 1 erstellen
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 / command geöffnet und der Inhalt an den Server xxxx (# 2) gesendet und dort Zeile für Zeile ausgeführt
Jetzt tun Sie jedes Mal, wenn etwas auf # 1 passiert:
1>
echo "ls -l" >> /tmp/commands
oder
1>
echo "reboot" >> /tmp/commands
Was auch immer Sie zur Datei / tmp / befehlen hinzufügen, wird an # 2 gesendet und ausgeführt. Stellen Sie einfach sicher, dass Sie nichts Interaktives ausführen oder irgendwie damit umgehen.
quelle
tail -F
, um festzustellen, dass die Datei ersetzt wurde. Wenn sie also riesig wird, können Sie sie löschen und mit einer neuen Datei beginnen.mkfifo /tmp/commands
eine bessere Lösung seinAutomatische Persistenz mit OpenSSH
Sie können auch die
ControlMaster
Funktion von OpenSSH verwenden, die einen Unix-Domain-Socket für die erste Verbindung öffnet und diese Verbindung in allen nachfolgenden Aufrufen wiederverwendet.Um die Funktion zu aktivieren, können Sie entweder
-M
als Befehlszeilenschalter verwenden oder dieControlMaster
Option in Ihrem aktivieren~/.ssh/ssh_config
, z.Darüber hinaus sollten Sie
ControlPath
die folgenden Zeilen in Ihrem verwenden~/.ssh/ssh_config
: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 im Voraus eine stille Verbindung herstellen, indem Sie:
Cheerio, Nesono
quelle
ssh -N
Startet eine Sitzung ohne Remote-Befehl, scheint keine entsprechenden Optionen in ssh_config.Zusätzlich
/etc/ssh/ssh_config
hinzufügenquelle
Wenn Sie häufig auf solche Dinge stoßen, versuchen Sie es mit Parallel . Es ist wie dsh (verteilte Shell), hat aber einige nette Funktionen wie das Zählen von Semaphoren und wird aktiv gepflegt.
Aus der Dokumentation:
BEISPIEL: GNU Parallel als Warteschlangensystem / Batch-Manager
GNU Parallel kann als einfaches Jobwarteschlangensystem oder Stapelmanager arbeiten. Die Idee ist, die Jobs in eine Datei zu packen und GNU Parallel kontinuierlich daraus lesen zu lassen. Da GNU Parallel am Ende der Datei stoppt, verwenden wir tail, um weiterzulesen:
So senden Sie Ihre Jobs an die Warteschlange:
Sie können natürlich -S verwenden, um die Jobs auf Remotecomputer zu verteilen:
Es gibt viele großartige Beispiele, die nur die Oberfläche zerkratzen. Hier ist eine coole.
BEISPIEL: Verteilen der Arbeit auf lokale und entfernte Computer
Konvertieren Sie * .mp3 in * .ogg und führen Sie einen Prozess pro CPU-Kern auf dem lokalen Computer und Server2 aus:
quelle
ja es ist mit einer Pfeife möglich:
Dadurch wird der Befehl echo "hi" auf host2 ausgeführt
Sie müssen nur ein Programm schreiben, das nur die Befehle ausgibt (vergessen Sie das nicht;) und dann diese Ausgabe an ssh weiterleiten
quelle
Möglicherweise möchten Sie ein Programm wie dsh (Distributed SHell) verwenden, das genau dafür ausgelegt ist :) Nachdem Sie es mit Hostnamen konfiguriert und publickeya auth eingerichtet haben, können Sie damit Befehle auf mehreren Computern entweder in Reihe ausführen ("run" auf Maschine a dann auf Maschine b ") oder in Pararell (" auf allen Maschinen gleichzeitig laufen ") ausführen. Oder einfach ein Skript erstellen
quelle
HAFTUNGSAUSSCHLUSS: Ich kann dies derzeit nicht testen, da ich auf einem Windows-Computer mit Bash, aber ohne SSH bin.
In einem Bash-Skript können Sie Folgendes tun:
Um Befehle zu senden, schreiben Sie sie an FD 4.
Wenn Sie dies auf diese Weise tun, können Sie nicht einfach auf die Ergebnisse der Befehle zugreifen, aber aufgrund Ihrer Frage scheint dies nicht erforderlich zu sein.
quelle