Jestem na to zagubiony. Ze strony podręcznika:
-f Requests ssh to go to background just before command execution.
Po uruchomieniu SSH z -f
opcją mam działający tunel. Ale po zakończeniu korzystania z niego nie wiem, jak dalej z nim współpracować. Na przykład nie mogę zamknąć tunelu SSH, kiedy go zakończę.
Znane mi metody nie działają. Na przykład jobs
nic nie zwraca. ~
Komenda nie jest rozpoznawana (i nie wiem dokładnie, jak go używać, tak).
pgrep
Mówi mi jednak, że tunel SSH nadal działa (po zamknięciu terminala itp.). Jak mam z tym współdziałać? Jak to zamknąć?
źródło
/tmp/session1
(Chociaż zaleca się, aby nazwać go przy użyciu % wzorców - patrz opis ControlPath wman ssh_config
)ssh -S <path-to-socket> -O exit <server>
polecenia może być dowolnym ciągiem, ale musi być obecny. To trochę niezręczne.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:
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:
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.
źródło
vncviewer 127.0.0.1::25091
jak używasz składni portu, a nie składni wyświetlania.Aby zabić tunel, użyj
ps -C ssh
lubps | grep ssh
innego wariantu, aby ustalić, który proces ssh uruchamia twój tunel. Więc zabij to.Alternatywnie możesz wyszukać proces, określając, który ma ten port otwarty:
Jeśli chcesz zabić wszystkich klientów ssh uruchomionych na twoim komputerze (jako użytkownik),
pkill ssh
zrób to.źródło
Jak odpowiedzieli inni tutaj,
pkill ssh
zabija to.Aby utworzyć tunel, który można przywrócić, uruchamiam go
screen
bez-f
opcji, a następnie odłączam ekran za pomocąCtrl-A D
. Aby przywrócić tunel, zadzwońscreen -r
.źródło
screen
.Kiedy zaczynam tunel z:
-f
Prosi ssh o przejście do tła tuż przed wykonaniem polecenia.-N
Nie wykonuj polecenia zdalnego. Jest to przydatne tylko w przypadku portów przekierowujących.-D
Określa lokalne „dynamiczne” przekierowanie portów na poziomie aplikacji.-l
Określa użytkownika do zalogowania się na komputerze zdalnym.Mogę to zamknąć za pomocą:
źródło
Najlepszym rozwiązaniem, jakie znalazłem, aby zabić wszystkie tunele w jednym wierszu poleceń, jest
ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill
w przypadku sesji ssh po prostu usuń opcję tunelu
ps -lef|grep ssh|awk '{print $4}'|xargs kill
źródło