Znalazłem rozwiązanie tutaj: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
Najlepszy sposób - tunele, które zamykają się automatycznie
Jak już wspomniano wcześniej, zamiast używać kombinacji przełącznika -f -N, możemy po prostu użyć opcji -f samodzielnie, ale także wykonać polecenie na zdalnej maszynie. Ale które polecenie należy wykonać, ponieważ wystarczy zainicjować tunel?
To wtedy sen może być najbardziej użytecznym ze wszystkich poleceń! W tej konkretnej sytuacji sen ma dwie zalety:
- nic nie robi, więc żadne zasoby nie są zużywane
- użytkownik może określić, na jak długo będzie on wykonywany
Jak te pomoce w automatycznym zamykaniu tunelu ssh wyjaśniono poniżej.
Rozpoczynamy sesję ssh w tle, wykonując polecenie uśpienia przez 10 sekund na zdalnym komputerze. Liczba sekund nie jest kluczowa. W tym samym czasie uruchamiamy vncviewer dokładnie tak jak wcześniej:
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
vncviewer 127.0.0.1:25901:1
W takim przypadku klient ssh otrzymuje polecenie rozwidlenia sesji ssh do tła (-f), utworzenia tunelu (-L 25901: 127.0.0.1: 5901) i wykonania polecenia uśpienia na zdalnym serwerze przez 10 sekund (uśpienie 10).
Różnica między tą metodą a poprzednią (przełącznik -N) polega zasadniczo na tym, że w tym przypadku podstawowym celem klienta ssh nie jest utworzenie tunelu, ale wykonanie polecenia uśpienia przez 10 sekund. Stworzenie tunelu jest pewnego rodzaju efektem ubocznym, drugorzędnym celem. Jeśli vncviewer nie był używany, klient ssh zakończyłby pracę po 10 sekundach, ponieważ nie miałby więcej zadań do wykonania, niszcząc jednocześnie tunel.
Jeśli podczas wykonywania polecenia uśpienia inny proces, w tym przypadku vncviewer, zacznie korzystać z tego tunelu i utrzyma go zajęty przez okres 10 sekund, to nawet jeśli klient ssh zakończy swoje zdalne zadanie (wykonanie uśpienia), nie może wyjdź, ponieważ tunel zajmuje inny proces. Innymi słowy, klient ssh nie może zniszczyć tunelu, ponieważ musiałby również zabić vncviewer. Kiedy vncviewer przestaje korzystać z tunelu, wtedy klient ssh również wychodzi, ponieważ już osiągnął swój cel.
W ten sposób żadne procesy ssh nie będą działały w tle.
/tmp/session1
(Chociaż zaleca się, aby nazwać go przy użyciu % wzorców - patrz opis ControlPath wman ssh_config
)