54 points par GN⁺ 2026-03-13 | 5 commentaires | Partager sur WhatsApp
  • Quand une session SSH se fige, il est possible d'effectuer divers contrôles via le menu de séquences d’échappement intégré à SSH, sans avoir à forcer l’arrêt du processus
  • Dans la session, après avoir saisi ↵Enter, entrez ~? pour afficher la liste des commandes cachées, et ~. permet de fermer immédiatement la connexion dans n’importe quelle situation
  • Ces séquences d’échappement sont intégrées au client SSH lui-même et fonctionnent même si le serveur ne répond plus ou si la connexion est rompue
  • Dans des sessions SSH imbriquées, il est possible d’utiliser ~~ pour transmettre la séquence au client interne
  • En complément, l’article présente aussi des options SSH utiles comme -C, -v et -D

Menu des séquences d’échappement SSH

  • Dans une session SSH, appuyez sur ↵Enter puis entrez ~? pour afficher la liste des séquences d’échappement prises en charge
  • Principales séquences :
    • ~. — fermer la connexion (y compris les sessions multiplexées)
    • ~B — envoyer un signal BREAK au système distant
    • ~C — ouvrir la ligne de commande (permet de configurer le port forwarding, avec help pour l’aide)
    • ~R — envoyer une demande de rekey
    • ~V/v — augmenter/réduire la verbosité (LogLevel)
    • ~^Zsuspendre SSH
    • ~# — afficher la liste des connexions redirigées
    • ~&basculer SSH en arrière-plan (lorsqu’il attend la fermeture de la connexion)
    • ~~ — envoyer le caractère d’échappement lui-même (en le tapant deux fois)
  • Ces séquences sont intégrées au client SSH lui-même, elles fonctionnent donc même si le serveur SSH ne répond pas ou si la connexion est interrompue
  • La plus utile est ~., qui permet de quitter immédiatement la session dans n’importe quelle situation lorsqu’elle est bloquée
  • Les séquences d’échappement ne sont reconnues qu’immédiatement après un saut de ligne (newline)

Utilisation dans des sessions SSH imbriquées

  • Dans un environnement imbriqué où l’on ouvre une session SSH depuis une autre session SSH, ~~ permet de transmettre la séquence au client interne
  • Exemple :
  pinkie@stable:~$ ssh ponyville        # stable  
  pinkie@ponyville:~$ ssh manehatten    # stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to manehatten closed. # ↵Enter `~~.`  
  pinkie@ponyville:~$                   # stable › ponyville  
  pinkie@ponyville:~$ ssh manehatten stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to ponyville closed. # ↵Enter `~.`  
  pinkie@stable:~$                      # stable  
  • En étant connecté selon le chemin stable → ponyville → manehatten
  • En saisissant ~~., seule la session la plus interne (manehatten) est fermée, puis retour à ponyville
  • En saisissant ~., la session intermédiaire (ponyville) est aussi fermée, puis retour à stable

Options SSH bonus

  • ssh -C — active la compression gzip ; la documentation indique que ce n’est pas nécessaire sur un réseau rapide, mais pour l’usage en TUI ou l’affichage de gros volumes de logs, cela améliore nettement la latence et la réactivité
  • ssh -v — active la journalisation détaillée (-vv, -vvv permettent d’afficher encore plus d’informations) ; utile pour déterminer, lors d’une connexion lente ou vers un équipement peu puissant comme un Raspberry Pi, si la connexion est réellement bloquée ou simplement très lente
  • ssh -D 1234 — crée un proxy SOCKS sur localhost:1234, permettant de passer par le réseau du serveur pour accéder à d’autres ressources ; pratique pour des opérations sur le LAN côté serveur ou comme VPN DIY simplifié

5 commentaires

 
t7vonn 2026-03-13

Waouh, c’est vraiment une fonctionnalité que je découvre ; je n’aurai donc plus besoin de fermer le terminal maintenant.

 
xguru 2026-03-13

Waouh... j’utilise SSH depuis plus de dix ans et c’est la première fois que je vois cette fonctionnalité.
Le menu s’affiche vraiment.

 
bus710 2026-03-13

J’arrête l’équipement
Euh......

 
GN⁺ 2026-03-13
Avis sur Hacker News
  • J’ai essayé de défendre activement les manpages. La plupart des manpages open source sont de grande qualité, et certaines sont vraiment remarquables
    Mais il y a un problème avec l’outil man lui-même. Par exemple, j’ai voulu trouver la syntaxe d’échappement ~? du client openssh, mais elle ne ressortait pas dans la manpage
    La raison, c’est que man remplace le caractère ~ par un tilde Unicode étrange, ce qui empêche toute recherche avec grep. Le caractère - subit la même transformation, donc lui non plus n’est pas trouvable
    C’est rédhibitoire pour la documentation des outils en ligne de commande. Ce genre de conversion devrait être désactivé par défaut

    • Je ne connaissais pas ce problème de conversion de caractères, mais on peut appuyer sur ctrl-r pour faire une recherche littérale (/<ctrl-r>~?)
    • Avec less, le pager par défaut de Debian, ça fonctionne bien
    • J’ai réglé ça avec l’option man -E ascii. Mon environnement est Cygwin 3.6.6, donc ça vient peut-être d’une différence de distribution
    • En utilisant neovim comme pager, la recherche de ~? fonctionne bien. Il faut simplement connaître l’échappement regex (\~?)
    • Sur macOS et CentOS aussi, la recherche \~\? fonctionne bien
  • J’utilise le raccourci ~. depuis longtemps, mais je ne connaissais pas le menu d’aide
    En tapant ~ deux fois, on peut envoyer un vrai tilde, et dans une session normale il n’est pas interprété comme un échappement sauf s’il s’agit du premier caractère saisi
    Autrement dit, ~ ne fonctionne comme échappement que lorsqu’il est le premier caractère d’une ligne et juste après une nouvelle ligne. La conception de l’UI est plutôt soignée

    • Pour les plus jeunes, en mode écho du terminal, la touche retour arrière n’efface pas réellement le tampon d’entrée
      On peut donc obtenir une sortie du type ls ~/^?^?^?^?^?~/a.out. SSH surveille le flux d’entrée, pas l’écran
    • L’inconvénient, c’est que si la session est bloquée, il faut d’abord appuyer sur Entrée pour quitter avec ~., et cela peut être envoyé au serveur
  • J’utilise SSH depuis plus de 15 ans, mais c’est la première fois que j’entends parler de ces séquences d’échappement
    La prochaine fois qu’une session se bloque, j’essaierai ~. à coup sûr. Ce sera bien mieux que de fermer le terminal

    • Si vos connexions SSH tombent souvent, cela peut venir d’un timeout TCP trop court du CGNAT
      Utiliser un VPN ou Tailscale peut résoudre le problème, sinon on peut ajuster les paramètres tcp_keepalive pour maintenir la connexion
      Exemple de configuration :
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      Avec ça, la session reste active même en environnement CGNAT
    • Cela fait 20 ans que j’utilise ~. chaque semaine. L’option -v de SSH est aussi utile pour le débogage des problèmes de connexion
    • Quand on enchaîne plusieurs connexions SSH, on peut fermer le deuxième hop avec ~~.
    • Moi aussi, ça fait presque 30 ans que je l’utilise, et avant ça j’utilisais rsh. Voir Berkeley r-commands
    • Avant de saisir ~., il faut impérativement appuyer sur Entrée pour commencer sur une nouvelle ligne
  • Moi aussi, j’utilisais ~. depuis longtemps, mais je ne connaissais pas les autres échappements. Ça ne marche pas directement sur l’invite du shell, donc il faut lancer cat puis saisir ~?

    • Ça fonctionne quand même. OpenSSH surveille uniquement l’entrée, pas la sortie, donc on peut quitter avec <enter>~.
    • Moi aussi j’ai toujours coupé les sessions avec ~., mais je ne savais pas que ~ ne fonctionnait qu’au début d’une nouvelle ligne. ~^Z a l’air utile aussi
      Ça me rappelle l’ancienne séquence ctrl-[ de telnet
    • Le client SSH reconnaît les échappements même sans connaître le mode de la session distante. Enter sert simplement à préparer une nouvelle saisie d’échappement
  • Ces fonctions viennent en réalité de rsh. Je m’en souviens, étant assez vieux

    • En réalité, le style de commandes ~ est apparu d’abord dans cu(1), à l’époque de 4.1BSD, avant rsh
    • Aujourd’hui, pour utiliser scp comme rcp, il faut passer l’option -O
    • En tant que personne ayant connu l’époque de uucp!bangpath, ça me fait sourire
  • Le menu SSH est utile pour faire du tunneling. Aujourd’hui, c’est parfois remplacé par des outils comme Tailscale, mais ça reste utile

    • Quand j’ouvre une « nouvelle connexion » dans un nouvel onglet, j’utilise la fonction ControlMaster
      Ça permet de multiplexer plusieurs sessions SSH sur une seule connexion, sans répéter l’authentification, et l’autocomplétion des onglets est aussi plus rapide
      En revanche, quand la connexion se fige, c’est un peu pénible
    • J’utilise souvent tuns.sh. C’est pratique pour exposer localhost vers l’extérieur
  • Ce n’est pas vraiment « secret », c’est surtout une fonction méconnue parce que la plupart des gens ne lisent pas les manpages jusqu’au bout

  • L’échappement ~ existait déjà dans cu sur UNIX dans les années 1970. On peut voir SSH comme son héritier

  • La configuration par défaut de ControlMaster n’est pas très pratique, donc ça vaut le coup d’ajouter un bloc comme celui-ci

    Host *
      ControlMaster auto
      ControlPath ~/.ssh/sockets/%r@%h:%p
      ControlPersist 10m
    

    Ainsi, SSH/scp/rsync vers le même hôte réutilisent la connexion existante
    On peut aussi ajouter un port forwarding en cours de session avec l’échappement ~C

    • Si on augmente ControlPersist à environ 1 heure, la connexion reste active même entre des connexions rapprochées
    • Il y avait aussi une blague disant que ce commentaire semblait écrit par un LLM
  • Moi aussi, quand une session SSH se figeait, je ne pouvais la récupérer qu’avec [Entrée] ~.
    Ça ressemble à une fonction cachée que seuls ceux qui connaissent bien Linux découvrent

 
kayws426 2026-03-13

Je le savais, mais je n’en ai presque jamais eu l’utilité. (...)