Come posso uscire da ssh quando si blocca?

340

Frequento spesso la ssh nel mio box a casa da scuola, ma di solito quando cambio classe e il mio computer si interrompe, la pipe si spezzerà. Tuttavia, ssh si blocca semplicemente - Ctrl + c , Ctrl + z e Ctrl + d non ha alcun effetto.

È fastidioso dover riavviare il mio terminale, e ancora più fastidioso dover chiudere e ricreare una nuova finestra sullo schermo.

Quindi la mia domanda, c'è un modo semplice per fare ssh die correttamente (ad esempio quando il pipe fallisce "normalmente" uscirà con un messaggio su una pipe rotta)? O devo capire che cos'è il PID e ucciderlo manualmente?

    
posta Wayne Werner 11.03.2011 - 17:22
fonte

3 risposte

472

Le chiavi normali vengono inoltrate sulla sessione ssh , quindi nessuna di queste funzionerà. Invece, usa le sequenze di escape. Per uccidere la sessione corrente, colpisci successivamente Invio ↵ , ~ , . .

È possibile elencare più di queste sequenze di escape con Invio ↵ , ~ , ? :

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.)

Puoi chiudere l'elenco delle sequenze di escape premendo invio .

Notare che poiché premendo ~ ~ fa sì che ssh invii ~ invece di intercettarlo, puoi indirizzare N nidificato ssh connessioni premendo ~ N volte. (Questo vale solo per ~ s che seguono direttamente un invio .) Vale a dire che invio ~ < kbd> ~ ~ ~ ~ . termina una sessione di ssh 5 livelli in profondità e mantiene gli altri 4 intatti.

    
risposta data geekosaur 11.03.2011 - 18:18
fonte
51

Potresti anche voler configurare keep-alive a livello di applicazione per SSH per impedirgli di bloccarsi sui problemi di connessione. Il mio ~/.ssh/config contiene questo:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Questo fa ssh client inviare keep-alive a livello dell'applicazione ogni 15 secondi. Ogni volta che tre di essi falliscono consecutivamente (il valore predefinito di ServerAliveCountMax ), il client considera la connessione come bloccata e la chiude.

Contro l'altra opzione TCPKeepAlive , questa viene verificata all'interno del canale crittografato e non è spoofabile.

Si noti che questi keep-alive aiutano anche, uhm, a mantenere attive le connessioni long-idling , evitando così di avere semichiuso sessioni di tcp sospese per ore intoccate.

Consiglio vivamente di attivare questa funzione se ci si imbatte regolarmente, ma si dovrebbe anche conoscere il leggero rischio di sicurezza che potrebbe imporre. Un attacco con testo in chiaro noto potrebbe diventare più facile se l'attaccante conosce l'intervallo e il contenuto di una connessione inattiva. Questo potrebbe essere il motivo per cui non è abilitato per impostazione predefinita.

    
risposta data ulidtko 11.03.2011 - 19:51
fonte
39

Come indicato nella risposta di geekosaur, la sequenza di escape ~. interromperà la connessione.

L'elenco completo delle sequenze di escape e quello che fanno possono essere visualizzati digitando ~? :

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.)
    
risposta data scottl 15.03.2011 - 07:39
fonte

Leggi altre domande sui tag