¿Cómo puedo salir de ssh cuando se bloquea?

380

Frecuentemente me meto en mi caja en casa desde la escuela, pero generalmente cuando cambio de clases y mi computadora se suspende, la tubería se rompe. Sin embargo, ssh simplemente se bloquea - Ctrl+ c, Ctrl+ zy Ctrl+ dno tienen ningún efecto.

Es molesto tener que reiniciar mi terminal, y aún más molesto tener que cerrar y volver a crear una nueva ventana de pantalla.

Entonces, mi pregunta, ¿hay una manera fácil de hacer que ssh muera correctamente (es decir, cuando la tubería falla "normalmente", saldrá con un mensaje sobre una tubería rota)? ¿O tengo que averiguar qué es el PID y eliminarlo manualmente?

Wayne Werner
fuente
Si me desconecté con una sesión SSH activa, se congela. Solo lo mato y comienzo una nueva sesión. No se pierde información porque uso la pantalla GNU.
Lekensteyn
Yo también: la pantalla es la mejor. Pero sigue siendo molesto tener que screen -x: P
Wayne Werner
[mosh] (mosh.mit.edu) es una buena alternativa para evitar este problema. Se "mantiene conectado" incluso con conectividad intermitente a Internet.
jaynp
@jaynp El inconveniente de mí usando Mosh (desde hace dos minutos) es que no sé cómo desconectarlo. Estoy usando una sesión tmux + irssi en un host remoto (como un IRC bouncer, más o menos) y quiero desconectarme a veces (mientras mantengo el tmux + irssi ejecutándose) y eso hice con <enter> + ~ +. usando SSH pero no funcionará usando mosh.
Pavel Šimerda

Respuestas:

534

Las claves normales se reenvían durante la sshsesión, por lo que ninguna de ellas funcionará. En cambio, use las secuencias de escape. Para matar la sesión actual hit posteriormente Enter ↵, ~, ..

Más de estas secuencias de escape se pueden enumerar con Enter ↵, ~, ?:

Supported escape sequences:
  ~.  - terminate session
  ~B  - send a BREAK to the remote system
  ~R  - Request rekey (SSH protocol 2 only)
  ~#  - list forwarded connections
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Puede cerrar la lista de secuencias de escape presionando enter.

Tenga en cuenta que debido a que presionar ~~hace sshque se envíe el en ~lugar de interceptarlo, puede abordar Nssh conexiones anidadas presionando ~ N veces. (Esto solo se aplica a los correos ~electrónicos que siguen directamente a enter). Es decir, que enter~~~~~.finaliza una sshsesión de 5 capas de profundidad y mantiene intactos los otros 4.

geekosaur
fuente
48
Para diseños de teclado donde ~hay una tecla muerta , la secuencia de teclas es Enter ~ Space ..
Søren Løvborg
1
He agregado más de las secuencias de escape que podrían ser útiles. :)
gertvdijk
55
Tenga en cuenta que es necesario comentar la línea EscapeChar ~en /etc/ssh/ssh_config(o ~/.ssh/ssh_configsi se prefiere).
Aditya MP
66
@Hitechcomputergeek Enter ~ ~ .Dado que ~ ~envía un literal a ~través de su sesión SSH, la segunda sesión SSH lo recibirá como una sola tilde e interpretará el .como parte de la fuga. Para enviar a la quinta sesión ssh anidada, solo use 5 tildes en su secuencia de escape.
Score_Under
44
cambio de vida;)
artm
54

También es posible que desee configurar sistemas de mantenimiento de nivel de aplicación para SSH para evitar que se bloquee por problemas de conexión. Mi ~/.ssh/configcontiene esto:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Esto hace que el cliente ssh envíe mensajes de mantenimiento de nivel de aplicación cada 15 segundos. Cuando tres de ellos fallan consecutivamente (el valor predeterminado de ServerAliveCountMax), el cliente considera la conexión como colgada y la cierra.

Opuesto a la otra opción TCPKeepAlive, esto se verifica dentro del canal encriptado y no se puede suplantar.


Se está observando que esos dispositivos vivos también ayudan a, uhm, mantener vivas las conexiones de inactividad prolongada , es decir, evitar que tengas sesiones tcp medio cerradas suspendidas durante horas intactas.

Le recomiendo activar esta función si se encuentra con esto regularmente, pero también debe conocer el ligero riesgo de seguridad que puede imponer. Un ataque de texto sin formato conocido podría ser más fácil si el atacante conoce el intervalo y el contenido de una conexión inactiva. Esta podría ser la razón por la cual no está habilitada de manera predeterminada.

ulidtko
fuente
3
Razones de seguridad. Podrías ir a tomar algo y dejar abierto ssh sessio y tu compañero de laboratorio con el que has trabajado en los últimos 20 años podría usar tu sesión para secuestrar el servidor y destruirlo ... mientras bebías en tu descanso de 10 minutos.
Luis Alvarado
2
@CYREX, ¿eh? ¿Y cómo puede desactivar la opción predeterminada evitar que tenga compañeros de laboratorio injustos? %)
ulidtko
1
@ulidtko: ¿Hay alguna razón para no establecerlo ServerAliveIntervalen 1 para que se detecte una conexión perdida de inmediato?
krlmlr
2
@gertvdijk: Gracias. Para mí, funciona incluso sin la Hostlínea. Además, "los cifrados modernos como Advanced Encryption Standard no son actualmente susceptibles a ataques de texto sin formato conocidos". (desde el enlace que agregó) ...
krlmlr
2
También puede reemplazar SSH con Mosh (shell móvil). Mosh se conecta al servidor a través de SSH, pero luego establece un canal basado en UDP que es resistente a los problemas de conexión. Mosh también tiene un eco local, por lo que puede ver lo que está escribiendo, incluso si el servidor no responde. Cuando se entregan las pulsaciones de teclas, Mosh marca el texto repetido. mosh.mit.edu
Pascal Rosin
41

Como se señaló en la respuesta de geekosaur, la secuencia de escape ~.terminará la conexión.

La lista completa de secuencias de escape y lo que hacen se puede mostrar escribiendo ~?:

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
scottl
fuente
¿Cómo cierro la lista de secuencias de escape?
Kristianp
3
No lo hace, después de que imprime la lista de secuencias de escape, está lista para aceptar la siguiente.
Tejas Kale