Cómo matar una sesión SSH congelada: secuencias de escape

Pulsa Enter, luego ~ y luego . para cerrar una sesión SSH congelada. Tu ssh local gestiona estas teclas, así que funciona aunque el servidor ya no responda. El Enter es importante, porque el carácter de escape solo se reconoce justo después de un salto de línea. ssh termina entonces con código 255.

Actualizada el . OpenSSH 10.3 en macOS hacia OpenSSH 10.0 en Debian 13 en un contenedor desechable, con teclas enviadas por una terminal desde un script.

Cerrar una sesión congelada

Enter  ~  .

Verás:

Connection to server closed.

Pausamos el servidor para que no respondiera nada, y luego escribimos ~. justo después de otro texto. No pasó nada. Tras Enter, ~. cerró la sesión al instante. Si parece que no hace nada, pulsa Enter e inténtalo de nuevo.

Con multiplexación, ~. en una sesión que reutiliza la conexión cierra solo esa sesión. En la sesión que abrió la conexión, sin ControlPersist, termina todas las sesiones que la comparten.

Cerrar la sesión también termina los programas que hay dentro. Una shell en tmux sigue en marcha en el servidor: consulta cómo mantener viva una sesión SSH tras una desconexión con tmux.

Todas las secuencias de escape

Escribe ~? después de un salto de línea y tu ssh imprime esta lista. Todas necesitan un salto de línea antes, y no se envían al servidor.

TeclasQué hace
~.Cierra la conexión
~^ZSuspende ssh, donde ^Z significa Ctrl+Z. Vuelve con fg
~#Lista los canales y reenvíos abiertos
~&Pasa ssh a segundo plano cuando espera a que terminen los reenvíos al cerrar sesión
~?Muestra la lista
~CAbre una pequeña línea de comandos, si está activada
~BEnvía un BREAK
~IMuestra información de la conexión, en versiones posteriores a la 10.0
~RPide una nueva clave de sesión
~V y ~vReducen y aumentan el nivel de detalle del registro
~~Envía un solo ~

Suspender con ~^Z

~^Z [suspend ssh]
[1]+  Stopped                 ssh server
$ fg

Esto te devuelve a tu shell local sin cerrar la sesión. Tras fg la sesión continuó con normalidad en nuestra prueba.

~C: añadir un reenvío a una sesión abierta

Desde OpenSSH 9.2 está desactivado por defecto, y ~C imprime commandline disabled. Para activarlo:

ssh -o EnableEscapeCommandline=yes server

O pon EnableEscapeCommandline yes en ~/.ssh/config. Entonces ~C abre un prompt ssh>:

ssh> -L 8022:localhost:22
Forwarding port.
ssh> -KL8022
Canceled forwarding.

Escribe ? en ese prompt para ver los comandos. También acepta -R y -D. Confirmamos que el puerto se abrió tras -L y se cerró tras -KL.

Lo que hacen -L, -R y -D se explica en túneles SSH explicados: local, remoto y dinámico.

Sesiones anidadas

Si haces SSH de un servidor a otro, el ssh más externo ve primero el escape. Cada ~ adicional lo pasa un nivel hacia dentro:

TeclasCierra
~.La primera conexión, lo que también termina la interna
~~.La segunda conexión, dejándote en el primer servidor
~~~.La tercera conexión, con la misma regla

Probamos las dos primeras. ~~. imprimió Connection to localhost closed. y dejó funcionando la sesión externa.

Cambiar o desactivar el carácter de escape

Elige otro carácter si ~ es incómodo en tu teclado:

ssh -e '^' server

Ahora ^. cierra la sesión, y ~. es texto normal. Para desactivar los escapes, por ejemplo cuando pasan datos binarios por la sesión:

ssh -e none server

En ~/.ssh/config, la opción es:

Host server
  EscapeChar none

Con none, la sesión ya no se puede cerrar desde el teclado cuando se congela. Configura ServerAliveInterval para que una conexión muerta termine sola. Consulta Broken pipe y keepalive.

Preguntas

¿Por qué se congela mi sesión SSH?

Normalmente la red se cortó mientras la sesión estaba inactiva, y ssh sigue esperando a un servidor al que ya no llega. Ciérrala con Enter, ~, . y pon ServerAliveInterval 30 en ~/.ssh/config: así ssh detecta una conexión muerta y se cierra solo tras un minuto y medio, más o menos.

¿Por qué ~. no cierra mi sesión SSH?

El carácter de escape solo funciona justo después de un salto de línea, así que pulsa Intro antes. Tampoco hace nada si EscapeChar es none, si -e eligió otro carácter o en una sesión sin terminal.

¿Cómo escribo una ~ al principio de una línea en SSH?

Escríbela dos veces. ~~ envía una sola ~ al servidor.

¿Para qué sirve ~C en SSH?

Abre un prompt ssh> donde añades o cancelas reenvíos de puertos en una sesión abierta. Desde OpenSSH 9.2 está desactivado hasta que pones EnableEscapeCommandline yes.

Fuentes

Más en Sesiones y tmux

Todas las guías