it-swarm.com.de

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

Ich bin ziemlich verloren. Von der Manpage:

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

Nach dem Start von SSH mit dem -f Option, ich habe einen funktionierenden Tunnel. Aber nachdem ich es fertig benutzt habe, weiß ich nicht, wie ich weiter damit umgehen soll. Zum Beispiel ich kann den SSH-Tunnel nicht schließen, wenn ich damit fertig bin.

Die üblichen Methoden, die ich kenne, funktionieren nicht. Zum Beispiel gibt jobs nichts zurück. Das ~ Befehl wird nicht erkannt (und ich weiß sowieso nicht genau, wie man ihn benutzt).

pgrep teilt mir jedoch mit, dass der SSH-Tunnel noch ausgeführt wird (nachdem ich das Terminal geschlossen habe usw.). Wie interagiere ich damit? Wie schließe ich es?

59
MountainX

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 allein verwenden, aber auch einen Befehl auf dem Remotecomputer 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 angeben, wie lange es 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, während wir den Befehl sleep 10 Sekunden lang auf dem Remotecomputer ausführen. Die Anzahl der Sekunden ist nicht entscheidend. Gleichzeitig führen wir vncviewer genau wie zuvor aus:

[[email protected]]$ ssh -f -L 25901:127.0.0.1:5901 [email protected] sleep 10; \
          vncviewer 127.0.0.1:25901:1

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

Der Unterschied zwischen dieser und der vorherigen Methode (-N-Switch) besteht im Wesentlichen darin, dass in diesem Fall das Hauptziel des SSH-Clients nicht darin besteht, den Tunnel zu erstellen, sondern den Schlafbefehl 10 Sekunden lang auszuführen. Die Schaffung des Tunnels ist eine Art Nebeneffekt, ein sekundäres Ziel. Wenn vncviewer nicht verwendet würde, würde der ssh-Client nach 10 Sekunden beendet, da er keine weiteren Aufgaben 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 auch dann nicht tun, wenn der ssh-Client seinen Remote-Job beendet (Ausführung des Ruhezustands) Beenden, weil ein anderer Prozess den Tunnel belegt. Mit anderen Worten, der ssh-Client kann den Tunnel nicht zerstören, da er auch vncviewer beenden 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.

47
MountainX

Eine besonders gute Lösung für die Skripterstellung ist die Verwendung von master mode, mit einem Socket für Steuerbefehle:

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

So schließen Sie es wieder:

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

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

78
Brian H

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

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

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

Wenn Sie alle auf Ihrem Computer ausgeführten SSH-Clients (als Benutzer) beenden möchten, wird pkill ssh Dies tun.

Wie von anderen hier beantwortet, pkill ssh tötet es.

Um einen Tunnel zu erstellen, der zurückgebracht werden kann, starte ich ihn in screen ohne -f Option, und trennen Sie dann den Bildschirm mit Ctrl-A D. Um den Tunnel zurückzubringen, rufen Sie screen -r.

9
Haotian Yang

Wenn ich einen Tunnel beginne 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.
  • -N Fü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 wie auf dem Remotecomputer anmelden soll.

Ich kann es schließen mit:

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

Ich habe bei SO eine robuste Lösung gefunden, siehe: https://stackoverflow.com/a/26470428 . Alle Gutschriften gehen an @ghoti.

Ich hoffe, mir wird vergeben, dass ich die ganze Geschichte nicht wiederholt habe. Es basiert auf der "erweiterten" SSH ControlMaster Konfigurationsoption, die Sie am besten in Ihre ~/.ssh/config Datei. So habe ich es für VNC-over-SSH gemacht (im VPN meines Arbeitgebers sind alle Ports außer SSH und HTTPS geschlossen).

~/.ssh/config part (beachten Sie die Einträge ControlMaster und ControlPath:

Host vnc
    HostName    my.desktop.internal.within.company
    User    laryx
    IdentityFile ~/.ssh/id_ecdsa
    LocalForward 5999 127.0.0.1:5900
    RequestTTY no
    ExitOnForwardFailure yes
    ControlMaster auto
    ControlPath ~/.ssh/control_sockets%[email protected]%h:%p

Ich verbinde/trenne mich mit einem kleinen Bash-Skript:

#!/bin/bash
if [ $# -lt 1 ]; then
    echo "This script creates an SSH tunnel to my desktop"
    echo "so that I can share its screen via VNC-over-SSH"
    echo "Usage: $0 start|stop"
    echo "Remember to start VPN first!"
    exit 1
fi

if [ $1 == "start" ]; then
    # Assuming that the VPN connection has been established
    # 1) Start the tunnel with
    ssh -f vnc -N
    # 2) check it
    ssh -O check vnc
    echo "Now share the screen by connecting to 'vnc://localhost:5999'"
    exit 0
fi

if [ $1 == "stop" ]; then
    ssh -O exit vnc
    echo "Now you may exit the VPN"
    exit 0
fi

Der Tunnel wird über das ssh -O Befehle.

0
Laryx Decidua