Forma de evitar el tiempo de espera de la conexión ssh y la congelación del terminal GNOME

235

Cuando me conecto a través de ssh a ciertos servidores, el tiempo de espera y "congela" el terminal (no acepta entradas, no se desconecta, no puede Ctrl-C para matar el proceso ssh ni nada).

Esto está en Ubuntu, gnome-terminalaunque parece estar pausando la entrada / salida del terminal, y no afecta la operación del software del Terminal GNOME. Por lo tanto, es menos un error gnome-terminalque una molesta inconsistencia con ssh.

Entonces, ¿hay alguna manera de prevenir / recuperar el terminal de las conexiones ssh que han excedido el tiempo de espera?

Kzqai
fuente

Respuestas:

256

sshd (el servidor) cierra la conexión si no escucha nada del cliente por un tiempo. Puede decirle a su cliente que envíe una señal de señal de vida al servidor de vez en cuando.

La configuración para esto está en el archivo ~/.ssh/config. Para enviar la señal cada cuatro minutos a host remoto, ingrese lo siguiente en su ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Esto es lo que tengo en mi ~/.ssh/config.

Para habilitarlo para todos los hosts use:

Host *
  ServerAliveInterval 240

También asegúrese de ejecutar chmod 600 ~/.ssh/config, porque el archivo de configuración no debe ser legible en todo el mundo.

Ludwig Weinzierl
fuente
1
Gracias sblair por ayudarme con la redacción, es muy apreciado. Cambié "no debería" de nuevo a "no debo" porque ssh verifica los permisos del archivo y si es legible en todo el mundo o en grupo, falla.
Ludwig Weinzierl
1
Esto no es lo que pidió el OP. No está siendo expulsado debido a la inactividad. Está intentando conectarse y su terminal se está congelando.
Cerin
¿Dónde es esto ~/.ssh/config?
Usuario
1
@User '~ /' representa su carpeta de inicio. '.ssh' es una carpeta dentro de su carpeta de inicio.
wkm
66
esto es inútil si su conexión se está perdiendo ...
so12311
248

Prensa Enter, ~, .uno tras otro para desconectarse de una sesión congelado.

La sección "CARACTERES DE ESCAPE" en la página de manual de ssh explica los detalles subyacentes.

Peter Eisentraut
fuente
40
Me parece que esta respuesta responde con mayor precisión la pregunta y, en cualquier caso, era la respuesta que estaba buscando.
CoatedMoose
Tenga en cuenta que es necesario comentar la línea EscapeChar ~en /etc/ssh/ssh_config(o ~/.ssh/ssh_configsi se prefiere).
Aditya MP
@adityamenon No, EscapeChar ~ya es el valor predeterminado incorporado.
Peter Eisentraut
2
@Mark pregunta: "¿hay alguna manera de evitar que el terminal recupere las conexiones ssh que han excedido el tiempo de espera ?" El énfasis es mío.
CoatedMoose
2
Aunque fue incorrecto en el contexto de la pregunta, esto es exactamente lo que quería.
Subin Sebastian
38

Aunque esto no sea una respuesta directa a su pregunta, está muy relacionada con el problema que tiene. En lugar de tratar de mantener viva la conexión (todas las conexiones eventualmente mueren) puede usar multiplexores de terminal, como screeny tmuxque mantienen la sesión viva en segundo plano, incluso si su terminal se desconecta.

Esencialmente, cuando inicia sesión en el servidor SSH, ejecuta inmediatamente screenlo que creará y adjuntará una nueva sesión:

$ screen

Luego continúas y haces tu trabajo con el shell como lo harías normalmente. Ahora, si se corta la conexión, cuando pueda volver a conectarse y volver a conectarse al servidor a través de SSH, obtendrá una lista de las sesiones actuales con:

$ screen -ls

Para volver a adjuntar a una sesión:

$ screen -r <session>

donde <session>está el PID o el nombre de una sesión. ¡Volverá a conectarse a su sesión y podrá continuar desde donde lo dejó!

Incluso puedes separar la sesión y volver a conectarte desde casa para continuar desde el punto exacto donde lo dejaste. Para separar la sesión que usa C-aseguido de C-d(eso Control + Ay luego Control + D).

También hay un sencillo tutorial en línea .

Usar screeny tmuxen servidores remotos se considera una práctica recomendada y es muy recomendable . Algunas personas llegan a tener screensu shell de inicio de sesión predeterminado, por lo que cuando se conectan, comienzan inmediatamente una nueva screensesión.

fotos
fuente
2
otra alternativa es usar mosh: mosh.mit.edu
Zombies
Esto es especialmente útil si está utilizando un punto de acceso o wifi que ocasionalmente se cae.
Randall
11

Intente agregar -o ServerAliveInterval=30a su cadena de conexión ( 30significa 30 segundos y, por supuesto, se puede ajustar)

Fergie
fuente
5

También puede establecer un intervalo de tiempo de espera inactivo desde el lado del servidor SSH:

Expediente: /etc/ssh/ssh_config

Contenido:

ClientAliveInterval XX
ClientAliveCountMax YY

Esto funciona exactamente de la misma manera que la configuración del cliente, pero los paquetes nulos se envían desde el servidor, en lugar del cliente.

Extraído de:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

Ladinfremes
fuente
1

Para las personas que desean evitar que el cliente agote el tiempo de espera en primer lugar.

Podría intentar establecer ConnectTimeout 0en el archivo de configuración. El valor 0 significa que la conexión se mantendrá viva indefinidamente a menos que se cierre.

su archivo de configuración (o ssh_config) podría verse así:

Host *
   ConnectTimeout 0
Yohannes Libanos
fuente