- Cuando una sesión SSH se queda congelada, puedes controlarla de varias formas mediante el menú de secuencias de escape integrado en SSH, sin necesidad de forzar el cierre del proceso
- Dentro de la sesión, después de presionar
↵Enter, escribe ~? para ver la lista de comandos ocultos, y con ~. puedes cerrar la conexión de inmediato en cualquier situación
- Estas secuencias de escape están integradas en el propio cliente SSH, así que funcionan incluso si el servidor no responde o la conexión se cortó
- En sesiones SSH anidadas, puedes usar
~~ para pasar la secuencia al cliente interno
- Además, también se presentan opciones útiles de SSH como
-C, -v y -D
Menú de secuencias de escape de SSH
- Dentro de una sesión SSH, después de presionar
↵Enter, escribe ~? para ver la lista de secuencias de escape compatibles
- Principales secuencias:
~. — cerrar la conexión (incluidas las sesiones multiplexadas)
~B — enviar una señal BREAK al sistema remoto
~C — abrir la línea de comandos (permite configurar port forwarding; escribe help para ver la guía)
~R — solicitar rekey
~V/v — aumentar/disminuir la verbosidad (LogLevel)
~^Z — suspender SSH
~# — mostrar la lista de conexiones reenviadas
~& — mandar SSH al background (cuando está esperando que termine la conexión)
~~ — enviar el propio carácter de escape (escribiéndolo dos veces)
- Estas secuencias están integradas en el propio cliente SSH, por lo que funcionan incluso si el servidor SSH no responde o la conexión se ha interrumpido
- La más útil es
~., ya que permite cerrar la sesión al instante en cualquier situación cuando la sesión se congela
- Las secuencias de escape solo se reconocen justo después de una nueva línea (newline)
Uso en sesiones SSH anidadas
- En un entorno anidado donde vuelves a conectarte por SSH dentro de una sesión SSH, puedes usar
~~ para pasar la secuencia al cliente interno
- Ejemplo:
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
- Si estás conectado como
stable → ponyville → manehatten
- al escribir
~~., solo se cierra la sesión más interna (manehatten) y vuelves a ponyville
- al escribir
~., se cierra también la sesión intermedia (ponyville) y vuelves a stable
Opciones extra de SSH
ssh -C — activa la compresión gzip; en la documentación se indica que no es necesaria en redes rápidas, pero al usar interfaces TUI o al mostrar grandes volúmenes de logs puede mejorar mucho la latencia y la capacidad de respuesta
ssh -v — activa el logging detallado (-vv, -vvv muestran aún más información); es útil para distinguir si la conexión realmente se quedó colgada o simplemente está lenta, por ejemplo al conectarte a enlaces lentos o a equipos modestos como una Raspberry Pi
ssh -D 1234 — crea un proxy SOCKS en localhost:1234; permite conectarte a través de la red del servidor, lo que sirve para trabajar en la LAN del lado del servidor o usarlo como una VPN casera simple
5 comentarios
Vaya, en serio es una función que nunca había visto; ahora ya no tendré que cerrar la terminal
Guau... después de usar SSH por más de diez años, es la primera vez que veo esta función.
De verdad aparece un menú.
Apago el equipo
Eh......
Opiniones en Hacker News
Yo quería defender activamente las manpages. La mayoría de las manpages de código abierto tienen buena calidad, y algunas son realmente excelentes
Pero la propia herramienta
mantiene problemas. Por ejemplo, intenté encontrar la sintaxis de escape~?del cliente openssh, pero no se podía buscar en la manpageLa razón es que man convierte el carácter
~en una tilde Unicode rara, así que ya no se puede usar grep. Con el carácter-pasa lo mismo y tampoco se puede buscarEsto es fatal para la documentación de herramientas de línea de comandos. Este tipo de conversión debería venir desactivado por defecto
ctrl-rpara hacer una búsqueda literal (/<ctrl-r>~?)less, el pager predeterminado de Debian, funciona bienman -E ascii. Mi entorno es Cygwin 3.6.6, así que quizá sea una diferencia de distribuciónneovimcomo pager, la búsqueda de~?funciona bien. Solo hay que conocer el escape de expresiones regulares (\~?)\~\?Yo he usado el atajo
~.desde hace tiempo, pero no conocía el menú de ayudaSi escribes
~dos veces puedes enviar un carácter tilde real, y en una sesión normal no se reconoce como escape salvo que sea el primer carácter ingresadoO sea,
~solo funciona como escape cuando es el primer carácter de la línea y va justo después de una nueva línea. El diseño de la UI está bastante bien pensadoPor eso puede aparecer una salida como
ls ~/^?^?^?^?^?~/a.out. SSH vigila el flujo de entrada, no la pantalla~.primero hay que presionar Enter, y eso puede llegar a enviarse al servidorLlevo usando SSH más de 15 años, pero es la primera vez que veo estas secuencias de escape
La próxima vez que se congele una sesión definitivamente voy a probar
~.. Suena mucho mejor que cerrar la terminalSe puede resolver usando una VPN o Tailscale, o ajustando el parámetro
tcp_keepalivepara mantener viva la conexiónConfiguración de ejemplo: Así la sesión se mantiene incluso en entornos con CGNAT
~.cada semana. Si le das a SSH la opción-v, también sirve para depurar problemas de conexión~~.~., hay que presionar Enter para empezar en una línea nuevaYo también he usado
~.desde hace tiempo, pero no conocía los otros escapes. En el prompt del shell no funciona de inmediato, así que hay que ejecutarcaty luego escribir~?<enter>~.se puede salir~., pero no sabía que~solo funciona en una línea nueva.~^Ztambién parece útilMe recuerda a la vieja secuencia ctrl-[ de telnet
Entersolo sirve para preparar una nueva entrada de escapeEstas funciones en realidad vienen de rsh. Los más viejos todavía lo recordamos
~apareció antes en cu(1). Es de la época de 4.1BSD, anterior a rshscpcomo si fuera rcp, tienes que pasar la opción-OEl menú de SSH es útil cuando haces tunneling. Hoy en día a veces lo reemplazan cosas como Tailscale, pero sigue siendo útil
Permite multiplexar varias sesiones SSH en una sola, así no hay que autenticarse repetidamente y el autocompletado en pestañas va más rápido
Eso sí, cuando la conexión se cuelga puede ser un poco molesto
Más que “secreto”, es una función poco conocida porque la mayoría de la gente no lee la manpage hasta el final
El escape con
~ya se usaba en UNIX cu en los años 70. SSH puede verse como su descendienteLa configuración de ControlMaster es incómoda con los valores predeterminados, así que conviene agregar un bloque como este
Así, SSH/scp/rsync hacia el mismo host reutilizan la conexión existente
También puedes agregar port forwarding a mitad de sesión con el escape
~CControlPersisten algo como 1 hora, la conexión se mantiene incluso entre inicios de sesión separados por poco tiempoYo también solo podía recuperar una sesión SSH colgada con
[Enter] ~.Parece una función oculta que no conoces a menos que seas experto en Linux
Lo sabía, pero casi nunca tuve ocasión de usarlo. (...)