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?
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.
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 ;-)
/var/log/secure
und/var/log/auth.log
SSH-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 wennssh somehost
kein Befehl angegeben ist oderssh -t
), ist dies (normalerweise) angemeldetwtmp
, unabhängig davon, wie dieses Terminal angezeigt wurde (sshd, welche Methode auch immer zum Herstellen der Verbindung verwendet wurde, Terminal-Emulator-Anwendung usw.).ControlPersist 600
die 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)-S
(Socket angeben) und-M
(Masterverbindung erstellen) des SSH-Clients verwenden.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:
Geben Sie den lokalen Vorwärtsbefehl ein , um einen SSH-Tunnel zu öffnen:
Wo
targethost
ist 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
ssh
Client auf Ihrem Computer lauscht auf Port 22000 und leitet den an ihn gesendeten Datenverkehr an den Port 22001 weitertargethost
.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:
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
targethost
Shell-Instanz weiterleitet.3. Senden Sie Ihr Skript über den Tunnel
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.
quelle
~
muss das Zeichen nach einem Zeilenumbruch stehen, um zur Servicekonsole zu gelangen. DiesLF ~ C
ist wahrscheinlich eine bessere Reihenfolge.less
der gebräuchliche Standard-Pager die Suche unterstützt, die Ihnen das Scrollen erspart , wenn Sie Ihre Schlüsselwörter kennen: Geben Sie einfach einman ssh
/ESCAPE
und Sie sind da.