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.
/tmp/session1
(obwohl empfohlen wird, es mit % -Mustern zu benennen - siehe Beschreibung von ControlPath inman ssh_config
)