Fermer une session bloquée
Enter ~ .
Vous verrez :
Connection to server closed.
Nous avons mis le serveur en pause pour qu'il ne réponde plus, puis tapé ~. juste après d'autres caractères. Rien ne s'est passé. Après Entrée, ~. a fermé la session aussitôt. Si cela semble ne rien faire, appuyez sur Entrée et réessayez.
Avec le multiplexage, ~. dans une session qui réutilise la connexion ferme seulement cette session. Dans la session qui a ouvert la connexion, sans ControlPersist, il termine toutes les sessions qui la partagent.
Fermer la session arrête aussi les programmes qu'elle contient. Un shell dans tmux continue de tourner sur le serveur : voyez garder une session SSH active après une déconnexion avec tmux.
Toutes les séquences d'échappement
Tapez ~? après une nouvelle ligne et votre ssh affiche cette liste. Toutes exigent d'abord une nouvelle ligne, et elles ne sont pas envoyées au serveur.
| Touches | Effet |
|---|---|
~. | Ferme la connexion |
~^Z | Suspend ssh, où ^Z signifie Ctrl+Z. Revenez avec fg |
~# | Liste les canaux et les redirections ouverts |
~& | Met ssh en arrière-plan quand il attend la fin des redirections à la déconnexion |
~? | Affiche la liste |
~C | Ouvre une petite ligne de commande, si elle est activée |
~B | Envoie un BREAK |
~I | Affiche des informations sur la connexion, dans les versions après la 10.0 |
~R | Demande une nouvelle clé de session |
~V et ~v | Diminuent et augmentent le niveau de détail du journal |
~~ | Envoie un seul ~ |
Suspendre avec ~^Z
~^Z [suspend ssh]
[1]+ Stopped ssh server
$ fg
Cela vous ramène à votre shell local sans fermer la session. Après fg, la session a continué normalement dans notre essai.
~C : ajouter une redirection à une session ouverte
Depuis OpenSSH 9.2, cette fonction est désactivée par défaut, et ~C affiche commandline disabled. Pour l'activer :
ssh -o EnableEscapeCommandline=yes server
Ou réglez EnableEscapeCommandline yes dans ~/.ssh/config. ~C ouvre alors une invite ssh> :
ssh> -L 8022:localhost:22
Forwarding port.
ssh> -KL8022
Canceled forwarding.
Tapez ? à cette invite pour voir les commandes. Elle accepte aussi -R et -D. Nous avons confirmé que le port s'ouvrait après -L et se fermait après -KL.
Le rôle de -L, -R et -D est expliqué dans les tunnels SSH expliqués : local, distant et dynamique.
Sessions imbriquées
Si vous vous connectez en SSH d'un serveur à un autre, le ssh le plus externe voit l'échappement en premier. Chaque ~ supplémentaire le fait descendre d'un niveau :
| Touches | Ferme |
|---|---|
~. | La première connexion, ce qui termine aussi la connexion interne |
~~. | La deuxième connexion, vous laissant sur le premier serveur |
~~~. | La troisième connexion, selon la même règle |
Nous avons testé les deux premières. ~~. a affiché Connection to localhost closed. et laissé la session externe en état de marche.
Changer ou désactiver le caractère d'échappement
Choisissez un autre caractère si ~ est peu pratique sur votre clavier :
ssh -e '^' server
Désormais, ^. ferme la session, et ~. est du texte ordinaire. Pour désactiver les échappements, par exemple quand des données binaires traversent la session :
ssh -e none server
Dans ~/.ssh/config, l'option est :
Host server
EscapeChar none
Avec none, la session ne peut plus être fermée au clavier quand elle se fige. Réglez ServerAliveInterval pour qu'une connexion morte se termine d'elle-même. Voir Broken pipe et keepalive.
Questions
Pourquoi ma session SSH se bloque-t-elle ?
Le plus souvent, le réseau a coupé pendant que la session était inactive, et ssh attend encore un serveur qu'il ne peut plus joindre. Fermez-la avec Entrée, ~, . et réglez ServerAliveInterval 30 dans ~/.ssh/config : ssh repère alors une connexion morte et se ferme seul après environ une minute et demie.
Pourquoi ~. ne ferme-t-il pas ma session SSH ?
Le caractère d'échappement ne marche que juste après un retour à la ligne : appuyez d'abord sur Entrée. Il est aussi sans effet si EscapeChar vaut none, si -e a choisi un autre caractère, ou dans une session sans terminal.
Comment taper un ~ en début de ligne en SSH ?
Tapez-le deux fois. ~~ envoie un seul ~ au serveur.
À quoi sert ~C en SSH ?
Il ouvre une invite ssh> où vous ajoutez ou annulez des redirections de port dans une session ouverte. Depuis OpenSSH 9.2, il est désactivé tant que vous n'avez pas mis EnableEscapeCommandline yes.
Sources
- ssh(1), ESCAPE CHARACTERS, manuel OpenBSD
- ssh_config(5), EscapeChar, manuel OpenBSD
- Notes de version d'OpenSSH 9.2