54 puntos por GN⁺ 2026-03-13 | 5 comentarios | Compartir por WhatsApp
  • 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)
    • ~^Zsuspender 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

 
t7vonn 2026-03-13

Vaya, en serio es una función que nunca había visto; ahora ya no tendré que cerrar la terminal

 
xguru 2026-03-13

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ú.

 
bus710 2026-03-13

Apago el equipo
Eh......

 
GN⁺ 2026-03-13
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 man tiene problemas. Por ejemplo, intenté encontrar la sintaxis de escape ~? del cliente openssh, pero no se podía buscar en la manpage
    La 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 buscar
    Esto es fatal para la documentación de herramientas de línea de comandos. Este tipo de conversión debería venir desactivado por defecto

    • No sabía lo del problema de conversión de caracteres, pero puedes presionar ctrl-r para hacer una búsqueda literal (/<ctrl-r>~?)
    • En less, el pager predeterminado de Debian, funciona bien
    • Lo resolví con la opción man -E ascii. Mi entorno es Cygwin 3.6.6, así que quizá sea una diferencia de distribución
    • Si usas neovim como pager, la búsqueda de ~? funciona bien. Solo hay que conocer el escape de expresiones regulares (\~?)
    • En macOS y CentOS también funciona bien buscar \~\?
  • Yo he usado el atajo ~. desde hace tiempo, pero no conocía el menú de ayuda
    Si 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 ingresado
    O 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 pensado

    • Para los lectores más jóvenes: en el modo echo del terminal, retroceso no borra realmente el búfer de entrada
      Por eso puede aparecer una salida como ls ~/^?^?^?^?^?~/a.out. SSH vigila el flujo de entrada, no la pantalla
    • La desventaja es que, si la sesión se queda colgada, para salir con ~. primero hay que presionar Enter, y eso puede llegar a enviarse al servidor
  • Llevo 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 terminal

    • Si tu conexión SSH se corta con frecuencia, podría deberse a un timeout TCP corto de CGNAT
      Se puede resolver usando una VPN o Tailscale, o ajustando el parámetro tcp_keepalive para mantener viva la conexión
      Configuración de ejemplo:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      Así la sesión se mantiene incluso en entornos con CGNAT
    • Yo llevo 20 años usando ~. cada semana. Si le das a SSH la opción -v, también sirve para depurar problemas de conexión
    • Cuando encadenas varias conexiones SSH, puedes cerrar el segundo hop con ~~.
    • Yo también lo he usado casi 30 años, y antes de eso usaba rsh. Ver Berkeley r-commands
    • Antes de escribir ~., hay que presionar Enter para empezar en una línea nueva
  • Yo 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 ejecutar cat y luego escribir ~?

    • Aun así funciona. OpenSSH no vigila la salida sino solo la entrada, así que con <enter>~. se puede salir
    • Yo también siempre cortaba la sesión con ~., pero no sabía que ~ solo funciona en una línea nueva. ~^Z también parece útil
      Me recuerda a la vieja secuencia ctrl-[ de telnet
    • El cliente SSH reconoce los escapes aunque no sepa en qué modo está la sesión remota. Enter solo sirve para preparar una nueva entrada de escape
  • Estas funciones en realidad vienen de rsh. Los más viejos todavía lo recordamos

    • En realidad, el estilo de comandos con ~ apareció antes en cu(1). Es de la época de 4.1BSD, anterior a rsh
    • Hoy en día, si quieres usar scp como si fuera rcp, tienes que pasar la opción -O
    • Como alguien que recuerda la época de uucp!bangpath, esto me da risa
  • El menú de SSH es útil cuando haces tunneling. Hoy en día a veces lo reemplazan cosas como Tailscale, pero sigue siendo útil

    • Yo uso la función ControlMaster cuando abro “nueva conexión” en una pestaña nueva
      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
    • Yo uso mucho tuns.sh. Es práctico porque permite exponer localhost hacia afuera
  • 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 descendiente

  • La configuración de ControlMaster es incómoda con los valores predeterminados, así que conviene agregar un bloque como este

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

    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 ~C

    • Si dejas ControlPersist en algo como 1 hora, la conexión se mantiene incluso entre inicios de sesión separados por poco tiempo
    • También hubo una broma diciendo que este comentario parecía escrito por un LLM
  • Yo 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

 
kayws426 2026-03-13

Lo sabía, pero casi nunca tuve ocasión de usarlo. (...)