Jak ponownie połączyć się z rozłączoną sesją ssh

156

Czy istnieje sposób na połączenie się z odłączoną sesją ssh? Mamy problemy z połączeniem sieciowym ze zdalną witryną, nad którą pracujemy osobno; jednak w międzyczasie mamy do czynienia z dużą liczbą rozłączeń z powodu utraconych pakietów podczas połączenia z serwerami w zdalnej lokalizacji. Wiele razy sesja pozostaje aktywna przez jakiś czas, a czasem zdarza się, że jest w trakcie akcji (edycja pliku, uruchomienie jakiegoś procesu itp.), Do której muszę wrócić, a nie uruchomić ponownie, jeśli to możliwe.

Blady koń
źródło
10
Nie mogę uwierzyć, że nikt nie wspomniał o mosh.mit.edu
jwbensley
@javano: Nigdy o tym nie słyszałem. Dodaj to jako odpowiedź!
kbyrd
@kbyrd Zrobiłem;)
jwbensley
podobne pytanie zostało zadane w unix.stackexchange.com/questions/105001/... z pewnymi wskazówkami, jak obejść rozłączenia w pierwszej kolejności ...
anarcat

Odpowiedzi:

135

AKTUALIZACJA: Aby uzyskać rzeczywistą odpowiedź, zobacz odpowiedź zero_r poniżej

To nie jest odpowiedź, ale obejście. Użyj ekranu .

Po pierwszym zalogowaniu uruchom ekran. Otrzymasz kolejną powłokę, uruchom w niej polecenia. Jeśli jesteś rozłączony, proces ekranowania utrzymuje terminal przy życiu, aby twoja powłoka i uruchomione procesy nie upadły. Po ponownym połączeniu uruchom „screen -r”, aby wznowić.

Konfiguracja i korzystanie z ekranu ma jeszcze wiele innych zalet, ale powyższe powinno rozwiązać problem.

kbyrd
źródło
18
Lub użyj tmux - „fajniejszego” ekranu, użyłem obu i zdecydowanie wolę tmux, ponieważ możesz ładnie podzielić ten termin.
John Hunt
3
Z przyjemnością stwierdziłem, że screenjest już zainstalowany na moim Ubuntu 12.x, więc jeśli nie jesteś pewien, po prostu wypróbuj to polecenie, ponownie nawiązał połączenie i wznowił proces aktualizacji do-release : sudo screen -D -r
bjm88
1
@ bjm88, sudonależy używać tylko wtedy, gdy oryginalna sesja ekranowa została zainicjowana za pomocą sudo. W przeciwnym razie powróci, jakby nie istniała żadna sesja ekranowa:There is no screen to be detached
Noam Manos
+1 Zdaję sobie sprawę, że to nie jest właściwa odpowiedź; jednak screen -rbyło dokładnie to, czego szukasz.
Eric Nelson
129

Spróbuj ustawić ClientAliveInterval (np. 60) i TCPKeepAlive (tak lub nie) na odpowiednie wartości na serwerze sshd.conf.

To powinno utrzymać twoją sesję przy życiu, nawet jeśli połączenie zostanie utracone na kilka minut.

zero_r
źródło
24
Jak dotąd wydajesz się być jedynym, który faktycznie odpowiada na pytanie, zamiast sugerować ekran jako obejście problemu.
kbyrd
2
Dobra decyzja. Odkryliśmy, że ta metoda jest szczególnie przydatna podczas przechodzenia przez zapory ogniowe cisco ASA / PIX, które domyślnie lubią przekraczać limity czasu połączeń TCP.
Mike Pountney
5
Może nie jest to właściwe miejsce, aby zapytać, ale czy plakat może zmieniać odpowiedzi? Powinniśmy odpowiedzieć „na ekranie” (moje nie jest najlepsze, podoba mi się Mike Pountney, ale mam przedstawiciela) z tymi informacjami.
kbyrd
1
Czy to zadziała po połączeniu przez połączenie Cisco VPN, a połączenie VPN zostanie utracone i ponownie ustanowione?
Brent
dla mnie ekran działa idealnie, mogę ponownie połączyć się z zadaniami wyświetlanymi na ekranie i przejść do pracy
integratorIT
64

Jak wspomniano powyżej, GNU Screen jest właściwą drogą. Umożliwi to przeprowadzenie „sesji ekranowej” na zdalnym urządzeniu, w której można uruchamiać wiele poleceń za pośrednictwem wielu „okien ekranowych”. To po prostu rozłączy się, jeśli twoje macierzyste połączenie SSH umrze, utrzymując wszystkie podprocesy działające w nim przy życiu i dobrze.

man screen” jest twoim przyjacielem jak zwykle, a pakiet systemu operacyjnego powinien zostać nazwany „ screen”, jeśli nie jest zainstalowany domyślnie.

Podstawy to:

  • Rozpocznij sesję ekranową (na zdalnym hoście):

    $ screen
    
  • Odłącz od sesji screen: CTRL-A,d

  • Ponownie połącz się z sesją ekranową po ponownym zalogowaniu:

    $ screen -d -r
    
  • Otworzyć kolejne okno „” ekranu: CTRL-A,c

  • Cykl przez ciebie otwarte okna ekran: CTRL-A,space

Istnieje wiele fajnych rzeczy, które możesz zrobić z ekranem. Używam go od ponad 10 lat i wciąż odkrywam nowe funkcje. To moje ulubione narzędzie uniksowe.

Mike Pountney
źródło
1
Tak, to znacznie lepsza odpowiedź niż moja.
kbyrd
Czy nadal mogę połączyć się z rozłączoną sesją ssh, jeśli ponownie uruchomię komputer, na którym jest uruchomiony ekran?
BarathVutukuri
tmux jest silniejszy
Pegasus
46

Nie mogę uwierzyć, że nikt nie wspomniał o MOSH ;

Mosh to oddzielny protokół, który może podłączyć się do procesu logowania SSH, utrzymuje sesję przy życiu po dniach rozłączenia, zmianie adresu IP, dużym opóźnieniu i tak dalej. Wyjaśniono to na stronie głównej lepiej niż potrafię to wyjaśnić, więc skopiowałem poniższy opis. Moje doświadczenia i porady są takie, że używam go na telefonie komórkowym z Androidem, jest to oszczędność życia podczas podróży i SSH'ingu. To samo dotyczy mojego laptopa, na przykład na uwięzi z telefonem komórkowym w pociągu. Polecam kompilowanie ze źródła, aby uzyskać najnowszą wersję, wersja repo dla mnie w Ubuntu ma kilka niedogodności, które zostały naprawione w najnowszej wersji (w momencie pisania).

Mosh (mobilna powłoka)

Aplikacja zdalnego terminala, która umożliwia roaming, obsługuje przerywane połączenia oraz zapewnia inteligentne lokalne echo i edycję linii klawiszy użytkownika.

Mosh zastępuje SSH. Jest bardziej niezawodny i responsywny, szczególnie w przypadku połączeń Wi-Fi, komórkowych i dalekobieżnych.

Mosh to darmowe oprogramowanie, dostępne dla systemów GNU / Linux, FreeBSD, Solaris, Mac OS X i Android.

Funkcje ze strony:

  • Zmień adres IP. Pozostań w kontakcie : Mosh automatycznie wędruje podczas przechodzenia między połączeniami internetowymi. Korzystaj z Wi-Fi w pociągu, Ethernetu w hotelu i LTE na plaży: będziesz zalogowany. Większość programów sieciowych traci połączenie po roamingu, w tym SSH i aplikacje internetowe, takie jak Gmail. Mosh jest inny.

  • Sprawia , że masz słodkie sny : dzięki Mosh możesz uśpić laptopa i obudzić go później, utrzymując nienaruszone połączenie. Jeśli połączenie internetowe zostanie zerwane, Mosh ostrzeże Cię - ale połączenie zostanie wznowione po powrocie usługi sieciowej.

  • Pozbądź się opóźnień w sieci : SSH czeka na odpowiedź serwera, zanim pokaże ci własne pisanie. To może zrobić kiepski interfejs użytkownika. Mosh jest inny: daje natychmiastową odpowiedź na pisanie, usuwanie i edycję linii. Robi to adaptacyjnie i działa nawet w programach pełnoekranowych, takich jak emacs i vim. W przypadku złego połączenia podkreślone są zaległe prognozy, abyś nie został wprowadzony w błąd.

  • Brak uprzywilejowanego kodu. Bez demona : Nie musisz być superużytkownikiem, aby zainstalować lub uruchomić Mosh. Klient i serwer to pliki wykonywalne uruchamiane przez zwykłego użytkownika i trwają tylko przez cały czas połączenia.

  • Ta sama metoda logowania : Mosh nie nasłuchuje na portach sieciowych ani nie uwierzytelnia użytkowników. Klient mosh loguje się na serwerze przez SSH, a użytkownicy przedstawiają te same poświadczenia (np. Hasło, klucz publiczny) jak poprzednio. Następnie Mosh uruchamia serwer mosh zdalnie i łączy się z nim przez UDP.

  • Działa wewnątrz terminala, ale lepiej : Mosh jest programem wiersza polecenia, takim jak ssh. Możesz go używać w Xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen lub tmux. Ale mosh został zaprojektowany od podstaw i obsługuje tylko jeden zestaw znaków: UTF-8. Naprawia błędy Unicode w innych terminalach i SSH.

  • Control-C działa świetnie : w przeciwieństwie do SSH, oparty na UDP protokół mosh radzi sobie z utratą pakietów z wdziękiem i ustawia częstotliwość klatek na podstawie warunków sieciowych. Mosh nie wypełnia buforów sieciowych, więc Control-C
    zawsze działa, aby zatrzymać niekontrolowany proces.

jwbensley
źródło
8
Mosh nie jest opakowaniem ssh - to inny protokół, prawie całkowicie niezwiązany z ssh (używa tylko ssh do logowania).
jch
+1 Bardzo prawda, mój błąd.
jwbensley,
2
Co z bezpieczeństwem, człowieku pośrodku? szyfrowanie? wymiana kluczy?
Nasir Iqbal,
Mosh wygląda super, chociaż niestety nie obsługuje port forwarding jeszcze .
Boann
20

autossh obserwuje twoje połączenie, a jeśli przestanie działać, połączy się ponownie. Jest bardziej niezawodny niż keepalives. Jeśli połączysz się z sesją ekranową, będziesz kontynuować od miejsca, w którym się rozłączyłeś (zobacz, rscreenże pochodzi z autossh)

Hayalci
źródło
1
poza konfigurowalnym utrzymywaniem przy życiu, z natury nie pozwala na ponowne połączenie się z sesją (czego szukał OP). ale autossh może być bardzo pomocny w przypadku aplikacji wymagających tuneli ssh, mapowania portów itp.
ives
tak, autossh + screen byłby najlepszym miejscem. autossh ma rscreenna to.
hayalci
Autossh jest lepszy niż mosh. Użyłem obu.
Sridhar Sarnobat
Oto post na blogu autorstwa Jesse Keatinga na temat używania autossh z ekranem .
sampablokuper
12

tmux

Ten jest klasykiem. Używaj go, gdy istnieje ryzyko utraty połączenia z terminalem.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Właśnie tak, wróciłeś do akcji.

Jacksonkr
źródło
Wielkie dzięki! Szukałem, jak to zrobić za pomocą Tmux, ponieważ wydaje się, że większość ludzi uważa to za lepszą opcję.
CoolOppo
10

Zainstalowałbym i uruchomiłem ekran, żeby naprawić problem. Screen pozwoli ci ponownie połączyć się z poprzednią sesją ekranu.

Poza tym screen pozwala ci robić fajne rzeczy, takie jak dzielenie ekranu, przeglądanie konsoli itp. Tutaj i tutaj możesz znaleźć więcej informacji .

Na początek, jeśli zostaniesz rozłączony, możesz użyć

screen -ls

aby zobaczyć swoje sesje i

screen -r ${session} 

aby ponownie połączyć się z odłączonym.

wzzrd
źródło
4

Jak zauważyli inni, ekran jest na ogół najlepszym rozwiązaniem do tego i dodaje wiele innych przydatnych funkcji.

Możesz skonfigurować swój profil na zdalnym komputerze, aby automatycznie uruchamiał się i / lub ponownie łączył z ekranem podczas logowania, co oszczędza Ci zapomnienia o uruchomieniu ekranu za jednym razem, gdy jest to potrzebne, ponieważ nastąpiło zerwanie połączenia.

Zobacz http://tlug.dnho.net/?q=node/239 (lub wyszukaj w Google wiele innych przykładów wykonanych nieco inaczej).

David Spillett
źródło
3

bardziej nowoczesna alternatywa dla screena, niestety niedostępna dla niektórych rodzajów „wirtualizacji” (np. w cygwinie możesz mieć „screen”, ale nie „tmux” ze względu na sposób jego zaprojektowania), ale wszędzie tam, gdzie masz możliwość zainstalowania tmux , Zdecydowanie polecam skorzystanie z jednej instancji ekranu.

cepal
źródło
3

Oto inne rozwiązanie nieekranowe.

Taca na szpachlę pozwala to zrobić, ma opcję ponownego połączenia po rozłączeniu, która nie jest normalna ani szpachlowaniem

https://puttytray.goeswhere.com/

jest to (całkowicie otwarte źródło) rozwidlenie kitu z innymi opcjami, przejdź do ustawień połączenia i są 2 opcje, jedna dla „próby ponownego połączenia w przypadku awarii połączenia” i „próby ponownego połączenia przy uruchomieniu”.

Munkiepus
źródło
1
Eh Czy przypadkiem jest wyposażony w keylogger i narzędzie do automatycznej ekstrakcji ppk?
Deer Hunter,
1
Zakładam, że pytasz, czy to w jakiś sposób, kradnie twoje dane, jest to całkowicie otwarte źródło, kod źródłowy jest dostępny na github, jeśli chcesz spojrzeć na jego github.com/FauxFaux/PuTTYTray jest wielu autorów: )
Munkiepus
wielkie zdrowie :)
Munkiepus
2

Chociaż screen utrzyma otwartą sesję powłoki na zdalnym serwerze, jeśli sesja ssh spadnie, nie zrobi nic z problemem zerwania połączeń ssh. Jak sugeruje zero_r, spróbuj dostroić połączenie ssh z utrzymywaniem przy życiu i długim czasem oczekiwania.

Sugeruję wyśledzenie przyczyny utraconych pakietów powodujących problemy i naprawienie ich zamiast obejścia tego.

David
źródło
Dzieki za sugestie. Pracujemy nad wyśledzeniem głównego problemu utraty pakietów, po prostu zajmuje to trochę czasu (bardzo trudne, tym razem!). To naprawdę jest obejście tego problemu. Nigdy nie wiadomo, kiedy coś spowoduje zerwanie połączenia.
palehorse
1
Będzie generować dużo hałasu, ale możesz spróbować uruchomić ssh przez strace i zobaczyć, co robi / zgłasza, gdy połączenie ssh znika. Może po prostu zgłosić to, co już wiesz, ale kto wie ...
David
1

Czasami zapomniałem też uruchomić ekran i straciłem niedokończoną pracę. W tym przypadku, chociaż nie możemy ponownie dołączyć do zepsutej sesji SSH, ponowne odtworzenie działającego programu na nowym terminalu i wznowienie tego, co robiłeś, jest nadal możliwe dzięki reptyr.

Po przypadkowym odłączeniu się od sesji SSH, pierwszą rzeczą jest uruchomienie, screenaby połączenie nie zostało ponownie zerwane. Następnie w nowej sesji uruchom, ps aux | grep {The process to be resumed}aby uzyskać PID. Dzięki PID możesz spróbować reptyr {PID}lub reptyr -T {PID}(jeśli istnieją podprocesy), aby kontynuować pracę.

march_happy
źródło