So beenden Sie eine SSH-Sitzung, die mit der Option -f gestartet wurde (im Hintergrund ausgeführt)


50

Ich bin ziemlich verloren. Von der Manpage:

 -f      Requests ssh to go to background just before command execution.

Nachdem -fich SSH mit der Option gestartet habe, habe ich einen funktionierenden Tunnel. Aber nachdem ich damit fertig bin, weiß ich nicht, wie ich weiter damit umgehen soll. Zum Beispiel kann ich den SSH-Tunnel nicht schließen, wenn ich damit fertig bin.

Die üblichen Methoden, die ich kenne, funktionieren nicht. Gibt beispielsweise jobsnichts zurück. Der ~Befehl wird nicht erkannt (und ich weiß sowieso nicht genau, wie ich ihn verwenden soll).

Allerdings pgrepsagt mir, dass der SSH-Tunnel noch läuft (nachdem ich das Terminal geschlossen habe, etc.). Wie interagiere ich damit? Wie schließe ich es?

Antworten:


65

Eine besonders gute Lösung für die Skripterstellung ist die Verwendung master modeeines Sockets für Steuerbefehle:

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

Um es wieder zu schließen:

ssh -S <path-to-socket> -O exit <server>

Dies vermeidet sowohl die Suche nach Prozess-IDs als auch Zeitprobleme, die mit anderen Ansätzen verbunden sein könnten.


10
Der <Pfad zum Socket> ist ein Pfad zu einer Datei, die die Master-Instanz des ssh-Clients für die Kommunikation zwischen Prozessen mit anderen ssh-Client-Instanzen erstellt, die die Verbindung der Master-Instanz gemeinsam nutzen möchten. Die erstellte Datei repräsentiert tatsächlich einen Unix-Domain-Socket. Es kann beliebig benannt und lokalisiert werden, z. B. /tmp/session1(obwohl empfohlen wird, es mit % -Mustern zu benennen - siehe Beschreibung von ControlPath in man ssh_config)
Golem

1
Es scheint auch, dass der <server> -Teil des ssh -S <path-to-socket> -O exit <server>Befehls eine beliebige Zeichenfolge sein kann, sie muss jedoch vorhanden sein. Das ist irgendwie ungeschickt.
Golem

1
Diese Antwort und Frage sind etwas alt, aber ich wollte dies als die wahrscheinlich eleganteste und "richtige" Art und Weise des Umgangs mit diesem Problem, das ich gesehen habe, bestätigen. Danke mein Herr!
Zentechinc

41

Ich habe die Lösung hier gefunden: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

Der beste Weg - Tunnel, die sich automatisch schließen

Wie bereits erwähnt, können wir anstelle der Schalterkombination -f -N nur -f verwenden, aber auch einen Befehl auf dem Remote-Computer ausführen. Aber welcher Befehl sollte ausgeführt werden, da wir nur einen Tunnel initialisieren müssen?

Dies ist, wenn Schlaf der nützlichste Befehl von allen sein kann! In dieser besonderen Situation hat der Schlaf zwei Vorteile:

  • es tut nichts, so dass keine Ressourcen verbraucht werden
  • Der Benutzer kann festlegen, wie lange er ausgeführt werden soll

Wie diese beim automatischen Schließen des SSH-Tunnels helfen, wird unten erläutert.

Wir starten die ssh-Sitzung im Hintergrund und führen den Befehl sleep 10 Sekunden lang auf dem Remote-Computer aus. Die Anzahl der Sekunden ist nicht entscheidend. Gleichzeitig führen wir vncviewer genauso aus wie zuvor:

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
          vncviewer 127.0.0.1:25901:1

In diesem Fall wird der ssh-Client angewiesen, die ssh-Sitzung in den Hintergrund zu stellen (-f), den Tunnel zu erstellen (-L 25901: 127.0.0.1: 5901) und den Befehl sleep auf dem Remote-Server 10 Sekunden lang auszuführen (sleep) 10).

Der Unterschied zwischen dieser Methode und der vorherigen (-N switch) besteht im Grunde darin, dass in diesem Fall das primäre Ziel des ssh-Clients nicht darin besteht, den Tunnel zu erstellen, sondern den Befehl sleep 10 Sekunden lang auszuführen. Die Schaffung des Tunnels ist eine Art Nebenwirkung, ein sekundäres Ziel. Wenn vncviewer nicht verwendet würde, würde der ssh-Client nach 10 Sekunden beendet, da er keine weiteren Jobs mehr zu erledigen hätte und gleichzeitig den Tunnel zerstören würde.

Wenn während der Ausführung des Befehls sleep ein anderer Prozess, in diesem Fall vncviewer, diesen Tunnel verwendet und ihn über den Zeitraum von 10 Sekunden hinaus belegt hält, kann er dies nicht tun, selbst wenn der ssh-Client seinen Remote-Job beendet (Ausführung von sleep) beenden, da ein anderer Prozess den Tunnel belegt. Mit anderen Worten, der ssh-Client kann den Tunnel nicht zerstören, da er auch vncviewer töten müsste. Wenn vncviewer den Tunnel nicht mehr verwendet, wird auch der ssh-Client beendet, da er sein Ziel bereits erreicht hat.

Auf diese Weise werden keine ssh-Prozesse im Hintergrund ausgeführt.


4
Eine kurze Bemerkung / Korrektur: Soweit ich weiß, müssen Sie angeben, vncviewer 127.0.0.1::25091wie Sie die Port-Syntax und nicht die Display-Syntax verwenden.
Christian Wolf

Dies ist eine großartige Idee und ein Problem, das ich unter Windows hatte. Neuere Versionen von Windows werden mit einem ssh-Client ausgeliefert, der theoretisch die Option -S unterstützt, bei mir jedoch nicht zu funktionieren schien.
Keeely

9

Um den Tunnel zu beenden, verwenden Sie ps -C sshoder ps | grep ssheine andere Variante, um festzustellen, welcher SSH-Prozess Ihren Tunnel ausführt. Dann töte es.

Alternativ können Sie nach dem Prozess suchen, indem Sie ermitteln, an welchem ​​dieser Port geöffnet ist:

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

Wenn Sie alle auf Ihrem Computer (als Benutzer) ausgeführten ssh-Clients beenden möchten, pkill sshwird dies ausgeführt.


6

Wie von anderen hier geantwortet, pkill sshtötet es.

Um einen Tunnel zu erstellen, der zurückgebracht werden kann, starte ich ihn screenohne die -fOption und entferne dann den Bildschirm mit Ctrl-A D. Um den Tunnel zurückzubringen, rufen Sie an screen -r.


Brute Force, aber effektiv
Afrosis

1
Passen Sie auf, wenn Sie eine Remoteverbindung herstellen. pkill ssh beendet sogar Ihre aktuelle Verbindung.
Kennyut

@kennyut Noch ein Grund mehr zu nutzen screen.
Haotian Yang

0

Wenn ich einen Tunnel starte mit:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f Fordert ssh auf, kurz vor der Befehlsausführung in den Hintergrund zu wechseln.
  • -NFühren Sie keinen Remote-Befehl aus. Dies ist nützlich, um nur Ports weiterzuleiten.
  • -D Gibt eine lokale "dynamische" Portweiterleitung auf Anwendungsebene an.
  • -l Gibt den Benutzer an, der sich auf dem Remotecomputer anmelden soll.

Ich kann es mit schließen:

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill

-1

Die beste Lösung, die ich gefunden habe, um alle Tunnel in einer Befehlszeile zu töten , ist

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

Entfernen Sie für die SSH-Sitzungen einfach die Tunneloption

ps -lef|grep ssh|awk '{print $4}'|xargs kill

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.