Jak mogę wyjść z SSH, gdy się zablokuje?

380

Często ssh do szkoły w domu ze szkoły, ale zwykle, gdy zmieniam lekcje i komputer zawiesza się, rura jest zepsuta. Jednak ssh po prostu się zamyka - Ctrl+ c, Ctrl+ zi Ctrl+ dnie działają.

To denerwujące, że muszę ponownie uruchomić terminal, a jeszcze bardziej denerwujące, że muszę zamknąć i ponownie utworzyć nowe okno ekranu.

Więc moje pytanie, czy istnieje prosty sposób, aby ssh umarł poprawnie (tj. Kiedy rura ulegnie awarii „normalnie”, wyjdzie z komunikatem o uszkodzonej rurze)? Czy też muszę dowiedzieć się, czym jest PID i ręcznie go zabić?

Wayne Werner
źródło
Jeśli rozłączę się z aktywną sesją SSH, zawiesza się. Po prostu go zabijam i rozpoczynam nową sesję. Żadne informacje nie są tracone, ponieważ używam ekranu GNU.
Lekensteyn,
Ja też - ekran jest najlepszy. Ale nadal denerwujące jest to, że screen -x: P
Wayne Werner
[mosh] (mosh.mit.edu) to fajna alternatywa, aby uniknąć tego problemu. „Pozostaje w kontakcie” nawet z przerywaną łącznością z Internetem.
jaynp
@jaynp Wadą używania mosh (od dwóch minut temu) jest to, że nie wiem, jak to odłączyć. Używam sesji tmux + irssi na zdalnym hoście (tak jak bramkarz IRC) i czasami chcę się rozłączyć (utrzymując działanie tmux + irssi) i zrobiłem to z <enter> + ~ +. przy użyciu SSH, ale nie będzie działać przy użyciu mosh.
Pavel Šimerda

Odpowiedzi:

534

Normalne klucze są przekazywane podczas sshsesji, więc żaden z nich nie będzie działał. Zamiast tego użyj sekwencji ucieczki. Aby zabić bieżąca sesja hit następnie Enter ↵, ~, ..

Więcej tych sekwencje mogą zostać dodane Enter ↵, ~, ?:

Supported escape sequences:
  ~.  - terminate session
  ~B  - send a BREAK to the remote system
  ~R  - Request rekey (SSH protocol 2 only)
  ~#  - list forwarded connections
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Możesz zamknąć listę sekwencji Escape, naciskając enter.

Zauważ, że ponieważ uderzenie ~~powoduje sshwysłanie ~zamiast przechwytywania, możesz adresować N zagnieżdżonych sshpołączeń, naciskając ~ N razy. (Dotyczy to tylko ~s, które bezpośrednio następują po enter.) To znaczy, że sesja enter~~~~~.kończy sshgłębokość 5 warstw i zachowuje pozostałe 4 nienaruszone.

geekozaur
źródło
48
W przypadku układów klawiatury, w których ~znajduje się martwy klawisz , sekwencja klawiszy to Enter ~ Space ..
Søren Løvborg,
1
Mam dodaje więcej sekwencje, które mogą być użyteczne. :)
gertvdijk,
5
Pamiętaj, że musisz odkomentować linię EscapeChar ~w /etc/ssh/ssh_config(lub ~/.ssh/ssh_configjeśli wolisz).
Aditya,
6
@Hitechcomputergeek Enter ~ ~ .Ponieważ ~ ~wysyła literał ~poprzez twoją sesję SSH, druga sesja SSH otrzyma go jako pojedynczą tyldę i zinterpretuje .jako część ucieczki. Aby wysłać do 5. zagnieżdżonej sesji ssh, po prostu użyj 5 tyld w sekwencji ucieczki.
Score_Under
4
życie się zmienia;)
artm
54

Możesz także ustawić utrzymanie aktywności na poziomie aplikacji dla SSH, aby zapobiec zawieszaniu się go w przypadku problemów z połączeniem. Mój ~/.ssh/configzawiera to:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

To powoduje, że klient ssh wysyła informacje o poziomie aplikacji co 15 sekund. Ilekroć trzy z nich ulegają awarii (ustawienie domyślne ServerAliveCountMax), klient uznaje połączenie za zawieszone i zamyka je.

W przeciwieństwie do drugiej opcji TCPKeepAlive, jest to sprawdzane w zaszyfrowanym kanale i nie jest sfałszowane.


Należy zauważyć, że te podtrzymania życia pomagają również, utrzymywać długo działające połączenia na biegu jałowym , tj. Zapobiegają zawieszeniu do połowy zamkniętych sesji Tcp przez wiele godzin.

Zdecydowanie polecam włączenie tej funkcji, jeśli regularnie się na nią natrafisz, ale powinieneś również wiedzieć o niewielkim ryzyku bezpieczeństwa, które może to powodować. Atak ze znanym tekstem jawnym może stać się łatwiejsze, jeśli atakujący zna przedział i zawartość bezczynności połączenia. Może to być powód, dla którego nie jest domyślnie włączony.

ulidtko
źródło
3
Względy bezpieczeństwa. Możesz iść napić się i zostawić otwarte ssh sessio, a twój partner laboratoryjny, z którym pracowałeś przez ostatnie 20 lat, może wykorzystać twoją sesję do przejęcia serwera i zniszczenia go ... podczas picia przez 10 minut przerwy.
Luis Alvarado,
2
@CYREX, co? W jaki sposób domyślnie wyłączona opcja może zapobiec nieuczciwym partnerom laboratoryjnym? %)
ulidtko
1
@ulidtko: Czy jest jakiś powód, dla którego nie ustawiono wartości ServerAliveInterval1, aby natychmiastowe połączenie zostało wykryte?
krlmlr
2
@gertvdijk: Dziękuję. Dla mnie działa nawet bez Hostlinii. Ponadto „Nowoczesne szyfry, takie jak Advanced Encryption Standard, nie są obecnie podatne na ataki ze znanym tekstem jawnym”. (z dodanego linku) ...
krlmlr
2
możesz także zastąpić SSH Mosh (mobilną powłoką). Mosh łączy się z serwerem przez SSH, ale następnie ustanawia kanał oparty na UDP, który jest odporny na problemy z połączeniem. Mosh ma także lokalne echo, więc możesz zobaczyć, co piszesz, nawet jeśli serwer nie odpowiada. Po naciśnięciu klawisza Mosh zaznacza powtórzony tekst. mosh.mit.edu
Pascal Rosin
41

Jak zauważono w odpowiedzi geekozaura, sekwencja ucieczki ~.zakończy połączenie.

Pełna lista sekwencji specjalnych i ich działań można wyświetlić, wpisując ~?:

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
scottl
źródło
Jak zamknąć listę sekwencji specjalnych?
kristianp
3
Nie, po wydrukowaniu listy sekwencji ucieczki, jest gotowy do przyjęcia następnej.
Tejas Kale