¿Cómo descongelar la terminal cuando muere la conexión SSH?

Estoy usando Mac 10.9.5 con shell bash. Ocasionalmente, cuando me conecto a otra máquina y luego la conexión muere (por ejemplo, Internet se cae o me muevo a una nueva ubicación), la ventana de la terminal con la sesión SSH abierta se congela y la única forma en que parece que puedo seguir adelante es para cerrarlo y comenzar una nueva sesión.

¿Hay alguna forma de configurar las cosas de tal manera que si la conexión de la sesión SSH muere, volveré a mi shell bash normal, como estaba antes de ejecutar mi sshcomando?

Intente configurar ServerAliveCountMax y ServerAliveInterval en su ~/.ssh/ssh_config.
@ScottDudley, ¿puede proporcionar más detalles?
@phatmann por ejemplo. con ServerAliveCountMax 4y ServerAliveInterval 15, si el cliente SSH no recibe una respuesta del servidor después de 4*15=60 segundos, debería desconectarse automáticamente. Consulte la página del manual para obtener más detalles.
returnluego ~.más información apple.stackexchange.com/questions/35524/…

Respuestas (1)

Puede suspender y luego eliminar el sshproceso que se colgó. Para hacer esto, debe emitir la secuencia de escape, suspender el sshproceso y luego usar kill -9para matar ese proceso.

La tecla de escape predeterminada para el ssh que se envía con OS X el ~carácter. Debe ingresarlo inmediatamente después de una nueva línea para que ssh lo respete. Y luego la secuencia de teclas Control- zse usa para suspender y poner en segundo plano una tarea en bash.

Así que prueba esta secuencia de teclas:

Return

~

Control-z

Si funciona verás algo como:

myhost.local:~ |ruby-2.2.0|
> ssh someremotehost
Last login: Fri Mar  6 14:15:28 2015 from myhost

someremotehost:~ |ruby-2.2.0|
> ~^Z [suspend ssh]

[1]  + 48895 suspended  ssh myremotehost

Esta línea de salida:

[1]  + 48895 suspended  ssh myremotehost

decirle el ID de proceso del sshproceso en su máquina. Está 48895en este ejemplo. Ese proceso aún se está ejecutando, solo se suspendió y se puso en segundo plano. Tienes que matarlo.

Puedes hacerlo con el killcomando. Quieres matarlo con prejuicio, así que usa la -9opción cuando llames killasí:

myhost.local:~ |ruby-2.2.0|
> kill -9 48895
[1]  + 48895 killed     ssh someremotehost

Simplemente use el PID de su ssh proceso cuando llame a ese comando en lugar del 48895PID que usé anteriormente.

Y tendrás tu aviso de vuelta.

Alternativamente, puede abrir una segunda ventana de Terminal y usar pspara encontrar el sshproceso en la lista de procesos y emitir la kill -9llamada contra el PID. Sin embargo, eso anula el proceso de recuperar el aviso en la ventana de Terminal original, ¿no es así?