Verwendung eines bereits eingerichteten SSH-Kanals


50

Ich habe bereits eine SSH-Verbindung zwischen zwei Maschinen hergestellt.

Gibt es eine Möglichkeit, Befehle von einem Shell-Skript, das auf dem lokalen Computer ausgeführt wird, unter Verwendung der bereits geöffneten Verbindung und ohne Starten einer weiteren SSH-Sitzung an den Remotecomputer zu senden?

Antworten:


56

Mit den neuesten Versionen von OpenSSH ist es sehr einfach, wenn Sie im Voraus planen.

Öffnen Sie das erste Mal eine Master-Verbindung. Leiten Sie für nachfolgende Verbindungen Slave-Verbindungen über die vorhandene Master-Verbindung. Richten Sie in Ihrem ~/.ssh/configdie automatische Verbindungsfreigabe ein:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Wenn Sie eine SSH-Sitzung zu demselben Zeitpunkt (Benutzer, Port, Computer) wie eine vorhandene Verbindung starten, wird die zweite Sitzung über die erste getunnelt. Das Herstellen der zweiten Verbindung erfordert keine neue Authentifizierung und ist sehr schnell.


Es sieht so aus, als ob der zweite nicht in / var / log / secure oder /var/log/auth.log registriert wird. Wird der zweite jedoch in / var / log / wtmp registriert?
SOUser

@ XichenLi /var/log/secureund /var/log/auth.logSSH-Verbindungen protokollieren; Eine Slave-Verbindung wird dort nicht angezeigt, da sie auf eine vorhandene Verbindung aufgesetzt wird. Wenn Ihre ssh-Sitzung ein Terminal zuweist (dh wenn ssh somehostkein Befehl angegeben ist oder ssh -t), ist dies (normalerweise) angemeldet wtmp, unabhängig davon, wie dieses Terminal angezeigt wurde (sshd, welche Methode auch immer zum Herstellen der Verbindung verwendet wurde, Terminal-Emulator-Anwendung usw.).
Gilles 'SO- hör auf böse zu sein'

2
Sie können auch ControlPersist 600die Verzögerung in Sekunden angeben, mit der sich der Socket im Leerlauf befindet, bevor er automatisch gelöscht wird. Andernfalls wird es automatisch geschlossen, wenn die Master-Verbindung beendet wird. Dies ist nicht gut, um eine Reihe von Befehlen remote auszuführen (z. B. eine Reihe von rsync-Befehlen für verschiedene Ordner)

2
Wenn Sie die globale Konfiguration nicht bearbeiten möchten, können Sie auch die Optionen -S(Socket angeben) und -M(Masterverbindung erstellen) des SSH-Clients verwenden.
Yankee

22

Das ist mit dem nc- Tool und den ssh-Tunneln ziemlich einfach zu erreichen .

1. Öffnen Sie den SSH-Tunnel

Geben Sie in Ihrer SSH-Sitzung ~Ceine neue Zeile ein. Sie erhalten die Eingabeaufforderung ssh "service console", die folgendermaßen aussieht:

ssh> 

Geben Sie den lokalen Vorwärtsbefehl ein , um einen SSH-Tunnel zu öffnen:

ssh> -L22000:targethost:22001
Forwarding port.

Wo targethostist der Hostname oder die IP-Adresse des Computers, mit dem Sie verbunden sind?

Angenommen, der SSH-Server auf dem Zielcomputer ist nicht für das Verbieten von Tunneln konfiguriert. Sie haben nun die gewünschte Verbindungsweiterleitung: Der sshClient auf Ihrem Computer lauscht auf Port 22000 und leitet den an ihn gesendeten Datenverkehr an den Port 22001 weiter targethost.

2. Starten Sie einen Netzwerkserver auf dem Remotecomputer

Dies ist so einfach wie das Eingeben des folgenden Befehls in Ihre bereits geöffnete ssh-Sitzung:

remote$ nc -l localhost 22001 | sh

Dadurch wird ein TCP-Server gestartet, der den Port 22001 überwacht - der der Zielport unseres SSH-Tunnels ist - und die empfangenen Daten (vermutlich Shell-Befehle) an eine targethostShell-Instanz weiterleitet.

3. Senden Sie Ihr Skript über den Tunnel

local$ cat yourscript.sh | nc localhost 22000

Dadurch wird der Skriptkörper an Ihren SSH-Tunnel gesendet und in einer Shell auf dem ausgeführt targethost. Sie werden die Ausgabe des Skripts in Ihrem Terminal mit ssh-Sitzung sehen.


Ich stelle außerdem fest, dass der SSH-Tunnel (Schritt 1) ​​in diesem Szenario nicht unbedingt erforderlich ist. Sie können den Server auch öffnen und direkt über das Internet darauf zugreifen. Sie müssen den Tunnel jedoch verwenden, wenn der Zielhost nicht direkt erreicht werden kann (z. B. hinter einem NAT) oder eine ssh-Verschlüsselung gewünscht wird.


3
Gute Antwort. Technisch gesehen ~muss das Zeichen nach einem Zeilenumbruch stehen, um zur Servicekonsole zu gelangen. Dies LF ~ Cist wahrscheinlich eine bessere Reihenfolge.
Alexios

@ Alexios, richtig.
ulidtko

Erstaunlicher Trick! Für die Aufzeichnung zeigt die ssh-Manpage einige weitere Informationen darüber (scrollen Sie nach unten zu dem Abschnitt mit dem Namen "ESCAPE CHARACTERS")
Carles Sala

@CarlesSala ist auch gut zu wissen, dass lessder gebräuchliche Standard-Pager die Suche unterstützt, die Ihnen das Scrollen erspart , wenn Sie Ihre Schlüsselwörter kennen: Geben Sie einfach ein man ssh /ESCAPEund Sie sind da.
ulidtko

@ulidtko sicher, aber soweit ich weiß, kann man einen CLI-Befehl nicht mit einem SO-Kommentar verknüpfen, daher fand ich die HTML-Manpage eine bessere Option ;-)
Carles Sala
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.