Jak mogę się zerwać z ssh, gdy się blokuje?

340

Często przychodzę do mojego pudełka w domu ze szkoły, ale zazwyczaj gdy zmieniam zajęcia i mój komputer zawiesza się, rura zostanie zerwana. Jednak ssh po prostu blokuje się - Ctrl + c , Ctrl + z i Ctrl + d nie mają żadnego efektu.

To denerwujące, że trzeba ponownie uruchomić terminal, a jeszcze bardziej irytujące jest zamknięcie i ponowne utworzenie nowego okna ekranu.

Więc moje pytanie, czy istnieje łatwy sposób, aby ssh umrzeć prawidłowo (tj. gdy rura ulegnie awarii "normalnie", to wyjdzie z komunikatem o zepsutej rurze)? Czy muszę wymyślić, czym jest PID i ręcznie go zabić?

    
zadawane Wayne Werner 11.03.2011, 17:22
źródło

3 odpowiedzi

472

Normalne klawisze są przekierowywane na sesję ssh , więc żadna z nich nie zadziała. Zamiast tego użyj sekwencji ucieczki. Aby zabić bieżącą sesję, naciśnij kolejno Enter ↵ , ~ , . .

Więcej z tych sekwencji escape można wyświetlić za pomocą 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ż naciśnięcie ~ ~ powoduje, że ssh wysyła ~ zamiast przechwytywać go, możesz adresować N zagnieżdżone ssh połączeń przez naciśnięcie ~ N razy. (To dotyczy tylko ~ s, które bezpośrednio następuje po enter .) To znaczy, że enter ~ < kbd> ~ ~ ~ ~ . kończy sesję ssh 5 warstw i utrzymuje pozostałe 4 nietknięte.

    
odpowiedział geekosaur 11.03.2011, 18:18
źródło
51

Możesz także skonfigurować utrzymanie aktywności na poziomie aplikacji , aby SSH uniemożliwił jej zamrożenie w przypadku problemów z połączeniem. Mój ~/.ssh/config zawiera to:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

To sprawia, że ​​klient ssh wysyła aplikację na poziom utrzymania co 15 sekund. Ilekroć trzy z nich kończą się niepowodzeniem (domyślnie ServerAliveCountMax ), klient traktuje połączenie jako zawieszone i zamyka je.

W przeciwieństwie do innej opcji TCPKeepAlive , jest to sprawdzane w zaszyfrowanym kanale i nie jest możliwe do sfałszowania.

Zauważono, że ci, którzy utrzymują się przy życiu, również pomagają, uhm, utrzymywać przy życiu długie jałowe połączenia , tj. uniemożliwiają ci posiadanie półzamknięte sesje tcp wiszące godzinami nietknięte.

Gorąco polecam włączanie tej funkcji, jeśli regularnie się na tym natkniesz, ale powinieneś również wiedzieć o niewielkim ryzyku bezpieczeństwa, jakie może na nią nakładać. ataki znanym tekstem jawnym mogą być łatwiejsze, jeśli atakujący zna przedział i zawartość bezczynnego połączenia. Może to być spowodowane tym, że nie jest domyślnie włączona.

    
odpowiedział ulidtko 11.03.2011, 19:51
źródło
39

Jak stwierdzono w odpowiedzi od geekozaura, sekwencja ucieczki ~. przerwie połączenie.

Pełna lista sekwencji ucieczki i ich działanie 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.)
    
odpowiedział scottl 15.03.2011, 07:39
źródło

Przeczytaj inne pytania na temat tagów