¿Cómo puedo evitar que una sesión SSH se cuelgue en la Terminal OS X?

101

Cuando cierro mi MacBook con una sesión SSH activa en Terminal y luego la despierto, el mensaje no responde.

En unos cinco minutos dice

Write failed: Broken pipe

y termina.

Esto también sucede cuando no escribo nada en la Terminal en aproximadamente quince minutos.

¿Puedo forzar a OS X a:

  1. Mantenga viva la conexión SSH durante el mayor tiempo posible
  2. Mátalo inmediatamente una vez que deje de responder

?

Dan
fuente

Respuestas:

121

Para mantener viva la conexión , puede verificar en /etc/ssh/ssh_configla línea donde dice ServerAliveInterval, que le dice con qué frecuencia (en segundos) su computadora enviará un paquete nulo para mantener viva la conexión. Si tiene un 0 que indica que su computadora no está tratando de mantener viva la conexión (está deshabilitada), de lo contrario le indica con qué frecuencia (en segundos) está enviando el paquete mencionado anteriormente. Intente poner 120 o 240, si todavía está cortando su conexión, puede bajar, tal vez a 5, si con ese número no sucede, tal vez sea su enrutador el que está descargando la conexión a la memoria libre.

Para matarlo cuando se cuelga , puede usar el carácter de escape ssh:

~.

Es decir, presione la tilde y luego el punto, si no funciona, presione Entrar antes de presionar eso, eso cerrará la conexión de inmediato.

Jorge Núñez
fuente
3
Ok, puedes matar la conexión con ~., ¡gran consejo! Pero, ¿qué hace realmente?
CousinCocaine
Lo único de lo que estaba confundido era si tenía que reiniciar sshd o no, pero parece que simplemente salir de la sesión y volver a conectar hizo el truco
dgig
A menudo el ~. no me funciona por varios minutos. ¿Porqué es eso?
Sridhar Sarnobat
2
La ubicación de ssh_configestá /etc/ssh/ssh_configen Mac OS X. Editaría la respuesta yo mismo, pero no tengo suficiente representante en este sitio para hacerlo.
Erik B
¿Debo poner esto en el cliente o el servidor? Creo cliente, pero puede ser más claro.
EralpB
23

Usted puede:

Configure su sistema, en todo el sistema, para todas las conexiones Editando : / etc / ssh / ssh_config Y agregue la línea:

ServerAliveInterval 10

O bien, por servidor ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Lo que esto básicamente hace es enviar un paquete de mantener vivo, cada 10 segundos ...

Aleksandar Pavić
fuente
9

También puedes intentar usar el impresionante proyecto mosh . Manejará con gracia las pérdidas de red, las máquinas se apagarán, etc. y felizmente restaurará la conexión cuando tenga una red en funcionamiento nuevamente.

Otra solución más tradicional es usar tmux en la máquina remota. En ese caso, es posible que todavía tenga una tubería rota, pero si vuelve a conectar su shell y las aplicaciones estarán esperando justo como las dejó.

BinaryPaean
fuente
En realidad, eso es exactamente lo que estoy haciendo ahora.
Dan
5

Las diversas respuestas aquí están en conflicto con respecto a la ruta exacta a los archivos de configuración. Tal vez es diferente en diferentes unixes? ¡Sugiero leer las páginas man en su sistema!

En man ssh (1) , busque el texto: config . En mi sistema, puedo elegir entre los archivos de configuración de todo el sistema o de este usuario (y las rutas son extrañamente diferentes).

En man ssh_config (5) , busque el texto: vivo . En mi sistema, parece que necesito configurar ServerAliveInterval y ServerAliveCountMax .

Lo que funcionó para mí, en macOS 10.12 Sierra, es poner las siguientes dos líneas en ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Ahora puedo enviar ssh a mi servidor Ubuntu 16.04 sin desconectar durante 20 * 180 segundos = 1 hora. ¡Me alegró el día!

Jerry Krinock
fuente
3

Reconecta automáticamente ssh después de dormir o interrupción wifi

  1. Instale autossh desde MacPorts o Homebrew:brew install autossh

  2. Abrir terminal y ejecutar autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Desconecta tu wifi o pon tu Mac a dormir.

  4. Cuando se vuelve a conectar a wifi, la sesión ssh se volverá a conectar automáticamente.


Ssh automáticamente después de iniciar sesión

Jon Stacey escribió una publicación de blog sobre la activación automática de una sesión ssh cuando inicia sesión.

  1. Instale autossh desde MacPorts o Homebrew:brew install autossh

  2. Cree un flujo de trabajo de Automator con un script bash.

Script de shell de Automator

  1. Vaya a los elementos de inicio de sesión en Preferencias del sistema .

Preferencias del sistema> Elementos de inicio de sesión

  1. Agregue su flujo de trabajo de Automator a los elementos de inicio de sesión .

Artículos de inicio de sesión

Kamil Slowikowski
fuente
1

Agregue estas dos líneas a /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes
MOHRE
fuente
1

Acabo de resolver este problema, agregue estas líneas en $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

La configuración TCPKeepAlive nole dice al cliente que asuma que la conexión sigue siendo buena hasta que una solicitud del usuario demuestre lo contrario, lo que significa que las interrupciones temporales de la conexión mientras su término ssh está inactivo en segundo plano no matarán la conexión.

Nur Rony
fuente