Wie kann ich über einen bestimmten Zeitraum eine dauerhafte SSH-Verbindung zum Streamen von Befehlen herstellen?

9

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.

Jakub Arnold
quelle

Antworten:

12

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.

Vitaly Nikolaev
quelle
Dies ist genau das, wonach ich gesucht habe, sehr kreative Lösung :)
Jakub Arnold
5
Ich würde hinzufügen, dass Sie verwenden sollten 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.
DerfK
3
@DerfK sollte alternativ mkfifo /tmp/commandseine bessere Lösung sein
Solotim
17

Automatische Persistenz mit OpenSSH

Sie können auch die ControlMasterFunktion 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 -Mals Befehlszeilenschalter verwenden oder die ControlMasterOption in Ihrem aktivieren ~/.ssh/ssh_config, z.

ControlMaster auto

Darüber hinaus sollten Sie ControlPathdie folgenden Zeilen in Ihrem verwenden ~/.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 im Voraus eine stille Verbindung herstellen, indem Sie:

ssh -MNf remotehost

Cheerio, Nesono

Nesono
quelle
Ich habe mich bei einem Serverfehler angemeldet, nur um +1 für Ihre Antwort zu stimmen. Deiner hat funktioniert!
Karma
ssh -NStartet eine Sitzung ohne Remote-Befehl, scheint keine entsprechenden Optionen in ssh_config.
Jokester
2

Zusätzlich /etc/ssh/ssh_confighinzufügen

# Send keep alive signal to remote sshd
ServerAliveInterval 60
Sandra
quelle
2

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:

echo >jobqueue; tail -f jobqueue | parallel

So senden Sie Ihre Jobs an die Warteschlange:

echo my_command my_arg >> jobqueue

Sie können natürlich -S verwenden, um die Jobs auf Remotecomputer zu verteilen:

echo >jobqueue; tail -f jobqueue | parallel -S ..

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:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
Allen
quelle
0

ja es ist mit einer Pfeife möglich:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

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

JMW
quelle
0

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

#!/bin/sh
ssh machine -- $@
exec $@
XANi
quelle
0

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:

exec 4> >(ssh --ssh-options-here user@host)

Um Befehle zu senden, schreiben Sie sie an FD 4.

echo 'echo hi' >&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.

user253751
quelle