- 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)
~^Z — suspendre 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
Waouh, c’est vraiment une fonctionnalité que je découvre ; je n’aurai donc plus besoin de fermer le terminal maintenant.
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.
J’arrête l’équipement
Euh......
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
manlui-même. Par exemple, j’ai voulu trouver la syntaxe d’échappement~?du client openssh, mais elle ne ressortait pas dans la manpageLa raison, c’est que
manremplace 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 trouvableC’est rédhibitoire pour la documentation des outils en ligne de commande. Ce genre de conversion devrait être désactivé par défaut
ctrl-rpour faire une recherche littérale (/<ctrl-r>~?)less, le pager par défaut de Debian, ça fonctionne bienman -E ascii. Mon environnement est Cygwin 3.6.6, donc ça vient peut-être d’une différence de distributionneovimcomme pager, la recherche de~?fonctionne bien. Il faut simplement connaître l’échappement regex (\~?)\~\?fonctionne bienJ’utilise le raccourci
~.depuis longtemps, mais je ne connaissais pas le menu d’aideEn 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 saisiAutrement 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éeOn peut donc obtenir une sortie du type
ls ~/^?^?^?^?^?~/a.out. SSH surveille le flux d’entrée, pas l’écran~., et cela peut être envoyé au serveurJ’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 terminalUtiliser un VPN ou Tailscale peut résoudre le problème, sinon on peut ajuster les paramètres
tcp_keepalivepour maintenir la connexionExemple de configuration : Avec ça, la session reste active même en environnement CGNAT
~.chaque semaine. L’option-vde SSH est aussi utile pour le débogage des problèmes de connexion~~.~., il faut impérativement appuyer sur Entrée pour commencer sur une nouvelle ligneMoi 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 lancercatpuis saisir~?<enter>~.~., mais je ne savais pas que~ne fonctionnait qu’au début d’une nouvelle ligne.~^Za l’air utile aussiÇa me rappelle l’ancienne séquence ctrl-[ de telnet
Entersert simplement à préparer une nouvelle saisie d’échappementCes fonctions viennent en réalité de rsh. Je m’en souviens, étant assez vieux
~est apparu d’abord dans cu(1), à l’époque de 4.1BSD, avant rshscpcomme rcp, il faut passer l’option-OLe menu SSH est utile pour faire du tunneling. Aujourd’hui, c’est parfois remplacé par des outils comme Tailscale, mais ça reste utile
Ç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
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éritierLa configuration par défaut de ControlMaster n’est pas très pratique, donc ça vaut le coup d’ajouter un bloc comme celui-ci
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
~CControlPersistà environ 1 heure, la connexion reste active même entre des connexions rapprochéesMoi 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
Je le savais, mais je n’en ai presque jamais eu l’utilité. (...)