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.
| Teclas | Qué hace |
|---|---|
~. | Cierra la conexión |
~^Z | Suspende 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 |
~C | Abre una pequeña línea de comandos, si está activada |
~B | Envía un BREAK |
~I | Muestra información de la conexión, en versiones posteriores a la 10.0 |
~R | Pide una nueva clave de sesión |
~V y ~v | Reducen 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:
| Teclas | Cierra |
|---|---|
~. | 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
- ssh(1), ESCAPE CHARACTERS, manual de OpenBSD
- ssh_config(5), EscapeChar, manual de OpenBSD
- Notas de la versión OpenSSH 9.2