Evitar que se te desconecte una sesión SSH por inactividad

Encabezando el TOP-TEN de las cosas que me rompen las pelotas últimamente probablemente esté esta “Not a bug, but a feature” que han tenido a bien implementar algunas distribuciones de Linux:

Si estás mucho tiempo (inactivo) haciendo otra cosa igual o mas de importante y no enviaste –o recibiste– datos por el canal SSH, no me importa nada de lo que hubieras estado haciendo, te desconecto y te vas cagar.

Por que total, si pasó mas de media hora de inactividad, es por que realmente ya no lo necesitás, ¿Cierto?

Bueno, no. No sé en que habrán estado pensando los que idearon este sistema ¿de seguridad?, ¿anti-robo quizás?, pero al menos conmigo, se equivocaron.

Suelo tener varias sesiones SSH abiertas en simultáneo y que te tomes la atribución de cerrarme alguna sin consultarme no me hace ni un poquito de gracia. Me molestaría inclusive si me preguntaras que hacer al respecto. A vos, developer de la tal o cual distribución mas masificada te hablo: Si tengo una sesión SSH abierta, ¡Es por que la necesito, carajo!

Así que acá va, para todo aquel que putee cada tanto por este mismo problema:

Como hacer que la sesión SSH no se te desconecte sola después de un tiempo por que tuviste que atender el teléfono.

Siendo que lo único que importa es que el canal de datos envíe o reciba en el intervalo de tiempo N especificado por tu distribución, conozco tres formas distintas de evitar que la conexión se cierre y te deje afuera.

Iniciar cualquier aplicación que mueva texto en pantalla:

Top, htop, iftop, iotop, nmon, watch, al que le tengas mas bronca. Es mas, hasta un simple ping a cualquier cosa: “ping aa.com” es todo lo que necesitás para que la conexión no se cierre. Mientras haya tráfico por que algo escupe texto esporádicamente en tu pantalla, suministro eléctrico y conexión a internet de ambos lados, viento en popa y un poco de suerte, vas a seguir conectado.

Si bien este método funciona, tiene la desventaja de que si en el apuro, un día de furia te olvidaste de ejecutar algo, ya te imaginarás que pasa.

Explicarle a PuTTY o al cliente SSH de Linux que como no te querés quedar fuera, se encargue del asunto:

PuTTY tiene la capacidad de mantener la conexión viva enviando tráfico “dummy” para así evitar el engorro. Muy facilmente puede gestionar esta cuestión por vos y es tan simple como hacer click en “connection” y poner un número mayor que cero pero menor que el intervalo que te deja fuera en la sección “Seconds between keepalives“. (Un buen número, podría ser por ejemplo, 60).

(Connections > Seconds between keepalives. Explicándole a PuTTY que no te tiene que desconectar por inactividad)


Si bien este método tambien funciona, tiene la desventaja de que tenés que hacer el cambio toooooodas y cada una de las veces que iniciás sesión, o bien guardarlo en el profile “Default Settings”. Si tenés además una lista gigante de direcciones almacenada en PuTTY, ir una por una haciendo este cambio es bastante molesto y sumale a eso que alguna vez vas a estar en una PC que no es tuya conectado por SSH y si te olvidaste, cagaste de nuevo.

Por otro lado, para el cliente SSH de Linux, la cosa es mucho mas fácil. Simplemente agregando a tu /etc/ssh/ssh_config la línea:

ServerAliveInterval 60

Hacer que el server SSH que escucha del otro lado se encargue de no desconectarte de prepo:

Esta es la mas eficiente de todas por lejos, por que es un cambio que se aplica una única vez y ya te queda, indistintamente de desde que PC y con que cliente te conectes.

Logueado en el servidor remoto, editás el archivo /etc/ssh/sshd_config y agregás estas dos lineas si no las tuvieras:

ClientAliveInterval 60
ClientAliveCountMax 3

Donde ClientAliveInterval es obviamente, lo mismo que te expliqué antes, pero del lado del server y ClientAliveCountMax es la cantidad de reintentos antes de que el servidor SSH decida:

No, no hay caso, ya le mandé tres keepalives de estos y del otro lado ni me respondieron nunca nada. Se le debe haber cortado internet así que lo desconecto.

10 Comentarios

  1. Que bien que me viene saber esto. Uso una cuenta shell gratuita para jugar un poco con PHP sin tener que configurar mi propio server y se me desconectaba siempre si lo dejaba de usar un rato (antes pensaba que era inevitable, que me sacaban a propósito por no garparles).

  2. jajajaja el día que te olvides de cerrar una sesión, y algún copado pase por tu PC y haga estragos, vas a amar la desconexión automática

    • Nooooo, cómo olvidarse de cerrar una sesión? Ctrl+Alt+L o Win+L según corresponda tiene que ser un movimiento tanto o más automatizado que la respiración o la digestión! Me extraña de su parte, DrM!

      Por suerte Debian no me cierra nada pero de solo leer tu post imagino el mal humor que me agarraría…

      Saludos,
      El Pibe de Sistemas

      • Claro, claro, en el laburo abunda el CTRL+ALT+L… y lo enseñamos a los nuevos cuando vemos un desktop sin bloquear mandándo mail a todos desde su cuenta comprometiéndose a comprar facturas al día siguiente
        Pero siempre alguno que la tiene clara sale rápido de su escritorio con la sesión iniciada… y ñácate!

      • Si existiera la posibilidad de que alguien me cague algo nada mas por amor al chiste -que no existe-, usaría CTRL+D.

        ¿Estamos hablando de Linux, se acuerdan?

        ¡Saludos!

  3. Este tipo de posts, avivan la eterna pelea entre el chaboncito de Seguridad Informatica y el Programador Geek que esta podrido de loguearse a cada rato…

    • Debe ser por eso que lo escribí yo, que no puedo jactarme de ser ni una cosa ni la otra.

      De todas formas, lo importante es que avive algo. Si paso y no dejo huella, ¿para qué paso?

      ¡Saludos!

  4. Justamente ayer investigando sobre esto mismo me encontre con algo que esta en casi todas las distros, que se llama screen, esta muy bueno, porque si te desconecta podes retomar ese “screen” via ssh y seguis desde donde este. Basicamente es un terminal virtual que aunque te desconectes te permite retomar la sesion.

Dejar respuesta

Please enter your comment!
Please enter your name here