GNU Screen y sesiones remotas

"Screen is a full-screen window manager that multiplexes a physical terminal between several processes (typically interactive shells). Each virtual terminal provides the functions of a DEC VT100 terminal and, in addition, several control functions from the ISO 6429 (ECMA 48, ANSI X3.64) and ISO 2022 standards (e.g. insert/delete line and support for multiple character sets)."

¿GNU Screen?
Screen es un completo administrador de sesiones de usuario, es decir que nos permite usar multiples sesiones (shells) sobre una sola terminal como si estas fuesen independientes. El alcance de esta nota es explicarles este comando de una manera sencilla (sin profundizar) y mostrarles una implementación dentro de un script, ¿va?

Si tienes una sesión establecida, por ejemplo una VPN hacia tu trabajo esta herramienta puede ser tu mejor opción para trabajar con multiples sesiones o si te encuentras ejecutando algún programa tal como un application server/container y necesitas ver la salida de esa aplicación y moverla a segundo plano sin perder tu sesión de usuario, uno de los casos donde me ha resultado muy útil es para capacitar a mis compañeros de manera remota.

Lo mas interesante es que puedes salirte de tu cuenta y dejar screen ejecutándose en segundo plano y si es necesario, ingresar nuevamente y retomar el control de la terminal al seleccionar la sesión de screen anteriormente ejecutada, interesante verdad?

Es necesario para poder trabajar con Screen el conocer algunas secuencias de teclado para moverse entre las sesiones, regresar a primer plano o visualizar regiones de trabajo. Listo algunas de las más usadas, si necesitas mayor información siempre puedes consultar el manual en linea o preguntarle a google:
Secuencia Comportamiento esperado
[Ctrl + a]Indica a screen la ejecución de un nuevo comando
[Ctrl + a] + "Presenta una lista de todas las sesiones disponibles
[Ctrl + a] + 0 ... 9Selecciona la sesión [0..9] disponible
[Ctrl + a] + cCrear una nueva sesión de usuario
[Ctrl + a] + dEnviar la terminal a segundo plano
[Ctrl + a] + nCambiarse a la siguiente sesión de usuario
[Ctrl + a] + pCambiarse a la anterior sesión de usuario



Configuración
Como cualquier herramienta, screen también cuenta con un archivo de configuración. Aunque este no es necesario para su ejecución, adecuaremos uno para su comprensión. Copialo y pégalo en un archivo .screenrc dentro del home de tu usuario.

# .screenrc 
# vim: set et ts=2 sw=2 sts=2 si ai: 

# .screenrc 
# =
#
# Andres Aquino 
# Hewlett-Packard Company
# 

#
# let's override 
startup_message off
vbell off
msgwait 1
altscreen on
shell -$SHELL
defutf8 on
shelltitle terminal

# don't screen resize 
termcapinfo  xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l

# Log 10000 lines
defscrollback 100000

# keybindings
bindkey -k k3 prev                        # F3  | Previous Window
bindkey -k k4 next                        # F4  | Next Window
register r "^a:source ${HOME}/.screenrc"  #     | Goes with F5 definition
bindkey -k k5 process r                   # F5  | Reload profile
bindkey -k k6 detach                      # F6  | Detach from this session

# Window tabs, second to last line
caption always '%{= WK}%?%-Lw%?%{K}(%{k}%n*%f%t%?(%u)%?%{K})%{K}%?%+Lw%?%?%= %{k}'

# Status string, last line
hardstatus alwayslastline
hardstatus string '%{Wk}%{B}Hewlett-Packard Company%{= Wk} %100`%120`%= %100`%120`%D|%Y.%m.%d~%0c:%s'



Casos Prácticos
#Descripción
1 Crear un nuevo pool de sesiones de usuario, sin ingresar dejando en segundo plano.
$> screen -d -m -S SessionName

Creamos una sesión llamada mySession y verificamos su creación listando las sesiones disponibles.



2 Ejecutar un comando en una sesión determinada
$> screen -r TerminalName -p IDSession -X stuff "$(printf '%b' "COMMAND\015")"

En mySession, terminal 0, ejecutamos un *echo*

y en la sesión...
Dentro de mySession, podemos corroborar la ejecución de ese *echo*



3 Activar un archivo de registro/log para una sesión volcando cada 5 segundos.
$> screen -r TerminalName -p IDSession -X log off
$> screen -r TerminalName -p IDSession -X logfile ~/mySession.log
$> screen -r TerminalName -p IDSession -X logfile flush 5
$> screen -r TerminalName -p IDSession -X log on

Desactivamos, ubicamos y registramos cada 2 segundos, lo activamos y probamos nuevamente con un *echo*

validamos el archivo de log...
Si ubicamos el archivo de log y verificamos su contenido, veremos las lineas de ejecución anteriormente ejecutadas.





Ciertamente existen otras alternativas como tmux (@petrohs nos da una breve nota al respecto aquí), sin embargo GNUScreen viene de cajón en la mayoría de los UNIX, en especial para mi que trabajo con HP-UX; así que lo que aquí encontrarás funcionará en HP-UX, de paso en GNULinux (RedHat, Ubuntu) y OS-X (si, el de MacOS).


Referencias

buen camino!

Popular Posts