Comment tuer une session SSH bloquée : les séquences d'échappement

Appuyez sur Entrée, puis ~, puis . pour fermer une session SSH bloquée. Votre ssh local traite ces touches : cela fonctionne donc même quand le serveur ne répond plus. L'Entrée compte, car le caractère d'échappement n'est reconnu qu'au début d'une nouvelle ligne. ssh se termine alors avec le code 255.

Mis à jour le . OpenSSH 10.3 sur macOS vers OpenSSH 10.0 sur Debian 13 dans un conteneur jetable, avec des touches envoyées à travers un terminal depuis un script.

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.

TouchesEffet
~.Ferme la connexion
~^ZSuspend 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
~COuvre une petite ligne de commande, si elle est activée
~BEnvoie un BREAK
~IAffiche des informations sur la connexion, dans les versions après la 10.0
~RDemande une nouvelle clé de session
~V et ~vDiminuent 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 :

TouchesFerme
~.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

Autres guides : Sessions et tmux

Tous les guides