Abr 23 2012

Retomar una sesión SSH de la que nos desconectamos

Gabolonte Blasfemus

si Keanu lo dice por algo seráPor estos días tenía una pequeña duda existencial (no, no de estas): ¿Qué pasaba cuando me desconectaba de una sesión SSH en la que estaba corriendo algo? Bueno, en realidad la respuesta a eso la intuía por experiencia y por mirar: Cuando el cliente se desconecta la sesión, y sus procesos hijos, son eliminados. Más bien mi inquietud era: ¿Existe alguna forma de dejar un proceso corriendo en una sesión, desconectarse y que este continúe ejecutándose, para luego volver a conectarse y resumir dicha sesión?

Pongamos como ejemplo que estamos cursando la carrera de BOFH básico, y hay un luser que nos cae tan pero tan bien que vamos a copiar una de sus copias de seguridad, donde figuran todos esos correos y videos calientes que no le muestra a nadie en la oficina, a una carpeta pública en la red para deleite de compañeros y superiores. Pero el muchacho en cuestión tiene tonelada de material, y es fanático de la alta definición, y nosotros queremos copiarlo todo; si lo hacemos desde una sesión SSH deberíamos tenerla abierta todo el tiempo que la operación de copia dure. Todo un bajón si estamos desde el Wi-Fi de nuestro café favorito y en un rato nos tenemos que ir, ya que si nos desconectamos, como dijimos antes, todos los procesos hijos se matan, entre ellos la copia de archivos que ejecutamos. Lo ideal sería, iniciar la copia ahora desde el café, y cuando lleguemos a nuestro nuevo destino volver a conectarnos por SSH y de alguna manera recuperar esa sesión, que nunca debería haberse anulado, para continuar viendo el proceso, o si ya terminó y todo salió bien.

Desde mi tierna inocencia sospechaba que un mundo tan poderoso a nivel línea de comandos como el de *nix tenía que tener desde hace tiempo una solución a esto, y esa solución es el comando screen. screen mantiene la sesión abierta por nosotros, con el proceso que hayamos lanzado corriendo, aún cuando nos hayamos desconectado. En realidad, screen es una herramienta mucho más poderosa, no pensada únicamente para esto, ya que se trata de un emulador de terminales virtuales desde donde podemos correr varias sesiones separadas de línea de comandos, cada una con su proceso, en simultáneo. Pero para nuestro fin todo lo que tenemos que saber es que tenemos que tipear el comando screen ni bien iniciamos sesión, luego presionar espacio o enter para continuar, y volveremos a la línea de comandos para hacer lo que tengamos que hacer, por ejemplo copiar los videos y mails de nuestro amigo luser. ¿Qué pasa entonces si nos desconectamos de la sesión SSH? screen continúa corriendo esa sesión de consola con el proceso que hayamos lanzado por nosotros. Cuando nos volvemos a conectar por una nueva sesión SSH y deseamos volver a ella, todo lo que tenemos que escribir es screen –r, y la magia sucederá.

la pantalla de inicio de screen

También podemos, como mencioné antes, manejar varias sesiones desde screen. Supongamos que mientras copiamos los videos de nuestro muchacho queremos hacer algo más, como por ejemplo borrarle un documento importante (acción digna de todo BOFH). Con presionar Control+a y luego c, screen creará una nueva sesión y nos posicionará en ella; de esta manera podemos crear tantas como necesitemos. Para luego volver a cada una, podemos presionar Control+a y el número de sesión (comienza desde 0) o simplemente Control+a y luego (comillas dobles) para visualizar un menú desde donde podemos ver las sesiones activas e ingresar a la deseada. Podemos ver la abrumadora lista de completa de atajos y parámetros de línea de comandos en su manpage cuando no tengamos nada que hacer durante una tarde.

image

Seguramente existirán a lo mejor otras formas de acometer el mismo fin propuesto, pero este método me resultó terriblemente cómodo, y para mejor, screen es uno de esos comandos que vienen incluidos en cualquier Linux; no hace falta andar instalando ni mucho menos compilando nada.