Mantener viva la sesión SSH [cerrada]


242

Yo uso ssh -p8520 username@remote_hostpara iniciar sesión en el servidor remoto.

Problema :

Siempre está conectado y funciona correctamente cuando estoy en el lugar de trabajo. Desafortunadamente, la terminal se congela en 10-15 minutos después de conectarme con el servidor remoto desde casa.

No hay un informe de error / tiempo de espera en la consola, pero el cursor no puede moverse más.

Cuando ingrese wpara verificar los usuarios de inicio de sesión, algunos usuarios de inicio de sesión de zombies están allí, y tengo que matarlos manualmente.

Esto es bastante molesto. ¿Alguien puede ayudarme?


También he tenido esto, comencé a usar screen. Tal vez esto sea algún tipo de problema de tiempo de espera.
Martin

@martin screenayuda a mantener el programa en ejecución. Lamentablemente, a veces tengo que trabajar en el servidor remoto :(
Haifeng Zhang

Si lo inicia sin parámetros, esto le da un shell.
Martin

¿Estás diciendo screensolo? ¿Puede resolver el problema de conexión perdida? No screen -S screenName? Siempre uso la pantalla con -Sy-r
Haifeng Zhang

1
No, esto no resuelve el problema, solo evita perder su trabajo en el terminal. Si no haces nada, todavía se congelará, solo puedes retomar donde comenzaste. Quise decir que puedes crear un terminal que siempre puedes reanudar usando screen. Parece que ya lo sabes;)
martin

Respuestas:


451

El demonio ssh (sshd), que se ejecuta en el lado del servidor, cierra la conexión desde el lado del servidor si el cliente se queda en silencio (es decir, no envía información). Para evitar la pérdida de conexión, indique al cliente ssh 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 $HOME/.ssh/config, cree el archivo si no existe (el archivo de configuración no debe ser legible en todo el mundo, por lo tanto, ejecútelo chmod 600 ~/.ssh/configdespués de crear el archivo). Para enviar la señal cada cuatro minutos (240 segundos) al host remoto, coloque lo siguiente en ese archivo de configuración:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Para habilitar el envío de una señal de mantenimiento para todos los hosts, coloque el siguiente contenido en el archivo de configuración:

Host *
    ServerAliveInterval 240

24
@ user271996, ¿por qué se debe reiniciar un demonio para una configuración del lado del cliente?
maxschlepzig

La configuración solo debe ser escribible por el usuario. la legibilidad no es una preocupación. Usar 600 como su nivel de permiso está bien, ya que solo puede escribirlo el usuario.
jbruni

1
por si no es obvio, este archivo de configuración está en su PC / Linux box
zzapper

55
Siempre me confundo con el nombre de la configuración: el cliente usa ServerAliveInterval mientras el servidor usa ClientAliveInterval . Que desastre.
youkaichao

@youkaichao A menudo existe esta confusión. Como diseñador de API, hay razones por las que podría expresarlo en ambos sentidos. En definitiva, lo más importante es una buena documentación del estándar elegido.
Cameron Tacklind

171

Quería una solución única:

ssh -o ServerAliveInterval=60 myname@myhost.com

Lo almacené en un alias:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

Ahora puedes conectarte así:

me@MyMachine:~$ sshprod

12
Eso es genial, pero no es exactamente una "solución única". Si va a conectarse al servidor más de una vez, ¿por qué no hacer Host *& ServerAliveInterval 240(o especificar el nombre de host, si solo lo desea myname@myhost.comcomo en la respuesta de rockymonkey555? Establecer un alias no parece más fácil de ninguna manera.
Lambart

8
O simplemente cree un alias en su ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
Quiere decir "una vez" como en "solo funciona una vez", no "solo tengo que escribirlo una vez".
Jonathan Hartley

1
Sí, si lees "una vez" como "uso único", esto hace el trabajo perfectamente.
philraj

Si quieres un "one-liner" que se ajuste ServerAliveIntervala 60, genial. Sin embargo, usar un alias bash cuando podría estar usando .ssh/configes una tontería.
Cameron Tacklind

50

Para aquellos que se preguntan, @ edward-coast

Si desea configurar la función de mantenimiento para el servidor , agregue esto a /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : establece un intervalo de tiempo de espera en segundos después del cual, si no se han recibido datos del cliente, sshd (8) enviará un mensaje a través del canal cifrado para solicitar una respuesta del cliente.

ClientAliveCountMax : establece el número de mensajes activos del cliente (consulte a continuación) que se pueden enviar sin que sshd (8) reciba ningún mensaje del cliente. Si se alcanza este umbral mientras se envían mensajes vivos del cliente, sshd desconectará al cliente y finalizará la sesión.


Parece que no existe un "parámetro" como ClientAliveInterval, solo ServerAliveInterval, puede consultar en la página del manual "man ssh_config"
dtj

66
Esa es la incorrecta, busque en "man sshd_config" la porción del servidor que ejecuta el demonio ssh, no la configuración del cliente.
Jeff Davenport

¿Debo usar ClientAliveIntervalpara permitir que el servidor verifique si el cliente está vivo, o debo dejar que el cliente haga "ping" al servidor ServerAliveIntervalrepetidamente? Ambos no parece que tiene sentido
qrtLs

1
Solo configure el ClientAliveIntervalen el servidor si desea que el servidor se desconecte en conexiones inactivas que no responden, y puede personalizar con qué frecuencia y cuándo sucede eso.
Jeff Davenport


10

Podemos mantener viva nuestra conexión ssh teniendo las siguientes configuraciones globales

Agregue la siguiente línea al /etc/ssh/ssh_configarchivo:

ServerAliveInterval 60

¿Eso solo funciona para el cliente o también funciona para sshd?
Costa de Edward

1
@EdwardCoast Funciona en la máquina del Cliente. Lo probé en Mac
minhas23
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.