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.
| Tasti | Cosa fa |
|---|---|
~. | Chiude la connessione |
~^Z | Sospende 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 |
~C | Apre una piccola riga di comando, se abilitata |
~B | Invia un BREAK |
~I | Mostra le informazioni sulla connessione, nelle versioni dopo la 10.0 |
~R | Chiede una nuova chiave di sessione |
~V e ~v | Diminuiscono 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:
| Tasti | Chiude |
|---|---|
~. | 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
- ssh(1), ESCAPE CHARACTERS, manuale OpenBSD
- ssh_config(5), EscapeChar, manuale OpenBSD
- Note di rilascio di OpenSSH 9.2