Jak zabić sesję SSH, która została uruchomiona z opcją -f (uruchom w tle)


49

Jestem na to zagubiony. Ze strony podręcznika:

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

Po uruchomieniu SSH z -fopcją 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 jobsnic nie zwraca. ~Komenda nie jest rozpoznawana (i nie wiem dokładnie, jak go używać, tak).

pgrepMówi mi jednak, że tunel SSH nadal działa (po zamknięciu terminala itp.). Jak mam z tym współdziałać? Jak to zamknąć?

Odpowiedzi:


64

Szczególnie dobrym rozwiązaniem dla skryptów jest użycie master modegniazda dla poleceń sterujących:

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

Aby ponownie zamknąć:

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

Pozwala to uniknąć grepowania identyfikatorów procesów i problemów związanych z synchronizacją, które mogą być związane z innymi podejściami.


10
Aby nieco rozszerzyć nieco dla niewtajemniczonych, <ścieżka-do-gniazda> jest ścieżką do pliku, który utworzy główna instancja klienta ssh do komunikacji międzyprocesowej z innymi instancjami klienta ssh, które chcą współdzielić połączenie instancji głównej. Utworzony plik będzie faktycznie reprezentował gniazdo domeny unix. Można go nazwać i zlokalizować, gdziekolwiek i gdziekolwiek chcesz, np. /tmp/session1(Chociaż zaleca się, aby nazwać go przy użyciu % wzorców - patrz opis ControlPath w man ssh_config)
golem

1
Wydaje się również, że <server> część ssh -S <path-to-socket> -O exit <server>polecenia może być dowolnym ciągiem, ale musi być obecny. To trochę niezręczne.
golem

1
Ta odpowiedź i pytanie są nieco stare, ale chciałem poprzeć to prawdopodobnie najbardziej elegancki i „poprawny” sposób rozwiązania tego problemu, jaki widziałem. Dziękuję Panu!
zentechinc

41

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.


4
Krótka uwaga / korekta: O ile wiem, musisz określić, vncviewer 127.0.0.1::25091jak używasz składni portu, a nie składni wyświetlania.
Christian Wolf

To świetny pomysł i zgrabnie rozwiązuje problem, który miałem w systemie Windows. Najnowsze wersje systemu Windows są dostarczane z klientem ssh, i teoretycznie obsługuje opcję -S, ale wydaje mi się, że nie działa.
Keeely

9

Aby zabić tunel, użyj ps -C sshlub ps | grep sshinnego 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:

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

Jeśli chcesz zabić wszystkich klientów ssh uruchomionych na twoim komputerze (jako użytkownik), pkill sshzrób to.


6

Jak odpowiedzieli inni tutaj, pkill sshzabija to.

Aby utworzyć tunel, który można przywrócić, uruchamiam go screenbez -fopcji, a następnie odłączam ekran za pomocą Ctrl-A D. Aby przywrócić tunel, zadzwoń screen -r.


Brutalna siła, ale skuteczna
mafroza

1
Uważaj, jeśli łączysz się zdalnie. pkill ssh zabije nawet twoje obecne połączenie.
kennyut

@kennyut Kolejny powód do korzystania screen.
Haotian Yang

0

Kiedy zaczynam tunel z:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f Prosi ssh o przejście do tła tuż przed wykonaniem polecenia.
  • -NNie 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ą:

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

-1

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.