Come chiudere una sessione SSH bloccata: le sequenze di escape

Premi Invio, poi ~, poi . per chiudere una sessione SSH bloccata. Questi tasti li gestisce il tuo ssh locale, quindi funziona anche quando il server non risponde più. L'Invio è importante, perché il carattere di escape viene riconosciuto solo subito dopo una nuova riga. ssh termina poi con codice 255.

Aggiornata il . OpenSSH 10.3 su macOS verso OpenSSH 10.0 su Debian 13 in un container usa e getta, con tasti inviati attraverso un terminale da uno script.

Chiudere una sessione bloccata

Enter  ~  .

Vedrai:

Connection to server closed.

Abbiamo messo in pausa il server in modo che non rispondesse a nulla, poi abbiamo digitato ~. subito dopo altro testo. Non è successo niente. Dopo l'Invio, ~. ha chiuso subito la sessione. Se sembra non fare nulla, premi Invio e riprova.

Con il multiplexing, ~. in una sessione che riusa la connessione chiude solo quella sessione. Nella sessione che ha aperto la connessione, senza ControlPersist, termina tutte le sessioni che la condividono.

Chiudere la sessione chiude anche i programmi al suo interno. Una shell in tmux resta attiva sul server: vedi come mantenere attiva una sessione SSH dopo la disconnessione con tmux.

Tutte le sequenze di escape

Digita ~? dopo una nuova riga e il tuo ssh stampa questo elenco. Tutte richiedono prima una nuova riga, e non vengono inviate al server.

TastiCosa fa
~.Chiude la connessione
~^ZSospende ssh, dove ^Z significa Ctrl+Z. Si torna con fg
~#Elenca i canali e gli inoltri aperti
~&Mette ssh in background quando attende la fine degli inoltri al logout
~?Mostra l'elenco
~CApre una piccola riga di comando, se abilitata
~BInvia un BREAK
~IMostra le informazioni sulla connessione, nelle versioni dopo la 10.0
~RChiede una nuova chiave di sessione
~V e ~vDiminuiscono e aumentano il dettaglio del log
~~Invia un solo ~

Sospendere con ~^Z

~^Z [suspend ssh]
[1]+  Stopped                 ssh server
$ fg

Ti riporta alla shell locale senza chiudere la sessione. Dopo fg la sessione è proseguita normalmente nella nostra prova.

~C: aggiungere un inoltro a una sessione aperta

Da OpenSSH 9.2 è disattivato di default, e ~C stampa commandline disabled. Per attivarlo:

ssh -o EnableEscapeCommandline=yes server

Oppure imposta EnableEscapeCommandline yes in ~/.ssh/config. Allora ~C apre un prompt ssh>:

ssh> -L 8022:localhost:22
Forwarding port.
ssh> -KL8022
Canceled forwarding.

Digita ? a quel prompt per i comandi. Accetta anche -R e -D. Abbiamo confermato che la porta si apriva dopo -L e si chiudeva dopo -KL.

Cosa fanno -L, -R e -D è spiegato in tunnel SSH spiegati: locale, remoto e dinamico.

Sessioni annidate

Se fai SSH da un server a un altro, l'ssh più esterno vede l'escape per primo. Ogni ~ in più lo passa di un livello più in basso:

TastiChiude
~.La prima connessione, che termina anche quella interna
~~.La seconda connessione, lasciandoti sul primo server
~~~.La terza connessione, seguendo la stessa regola

Abbiamo provato le prime due. ~~. ha stampato Connection to localhost closed. e ha lasciato funzionante la sessione esterna.

Cambiare o disattivare il carattere di escape

Scegli un altro carattere se ~ è scomodo sulla tua tastiera:

ssh -e '^' server

Ora ^. chiude la sessione, e ~. è testo normale. Per disattivare le escape, per esempio quando nella sessione passano dati binari:

ssh -e none server

In ~/.ssh/config, l'opzione è:

Host server
  EscapeChar none

Con none, la sessione non si può più chiudere dalla tastiera quando si blocca. Imposta ServerAliveInterval così che una connessione morta termini da sola. Vedi Broken pipe e keepalive.

Domande

Perché la sessione SSH si blocca?

Di solito la rete è caduta mentre la sessione era inattiva, e ssh aspetta ancora un server che non raggiunge più. Chiudila con Invio, ~, . e imposta ServerAliveInterval 30 in ~/.ssh/config: così ssh si accorge di una connessione morta e si chiude da solo dopo circa un minuto e mezzo.

Perché ~. non chiude la mia sessione SSH?

Il carattere di escape funziona solo subito dopo un a capo, quindi premi prima Invio. Non fa nulla nemmeno se EscapeChar è none, se -e ha scelto un altro carattere o in una sessione senza terminale.

Come scrivo una ~ a inizio riga in SSH?

Scrivila due volte. ~~ manda una sola ~ al server.

A cosa serve ~C in SSH?

Apre un prompt ssh> dove aggiungi o annulli inoltri di porta in una sessione già aperta. Da OpenSSH 9.2 è spento finché non imposti EnableEscapeCommandline yes.

Fonti

Altro in Sessioni e tmux

Tutte le guide