viernes, 20 de noviembre de 2009

Compartir terminales en linux [HOWTO]

El problema? Bueno, pues imaginemos que tenemos a un compañero que se tiene que conectar a nuestro servidor mediante SSH y que debe tener privilegios de superusuario. Cómo controlarlo? Pues lo que haremos será compartir su consola, así podremos ver todo lo que está haciendo en tiempo real. El resultado final será una ventana bash donde veremos todo los comandos que está ejecutando y sus resultados. Y si nosotros escribimos en ésta consola compartida, el también lo verá. Vamos allá:

Primero creamos el usuario que utilizará nuestro compañero y lo ponemos en el grupo de administradores.
$ sudo adduser foo
$ sudo adduser foo admin

Para poder ver lo que tiene dentro de su sesión abierta, utilizarmos el comando screen ( man screen ). Es un comando muy potente y os dejaré un par de links de información vária, para que veais como se utiliza. Para ello crearemos un script que se ejecutará cada vez que el usuario inicie sesión en una consola ( o mediante SSH )

Antes de nada debemos ejecutar los siguientes comandos para permitir compartir las consolas mediant el comandos "screen":
$ sudo chmod u+s /usr/bin/screen # Estamos dando permisos SUID al comando screen. Esto puede tener graves implicaciones de seguiridad. Úsese bajo su propia cuenta y riesgo.
$ chmod 755 /usr/bin/screen

Y vamos com el primer script:

##SCRIPT .autoconfig

#Creamos un nombre de fichero mas o menos aleatorio.
tmp_file_name=`date | md5sum | awk '{print $1}'`
# Para comprobar si existe ya una sesión de "screen" ya abierta para el usuario que queremos monitorizar haremos una búsqueda en la lista de procesos. PEEERO ( siempre hay un pero ) como el proceso se llama "screen", cuando buscamos nos encuentra también "gnome-screensav". El script contempla el hecho de que este proceso se esté ejecutando.

#Guardamos el resultado de la búsqueda de "gnome-screen" en la lista de procesos dentro de un fichero
ps -el | grep `id $USER -u` | grep gnome-screen > /tmp/$tmp_file_name

#Contamos la líneas del fichero
a=`cat /tmp/$tmp_file_name | wc -l`
#Si el número de líneas és igual a 1 significa que el proceso está ejecutándose
if [ $a -eq 1 ]; then
#Ahora hacemos una búsqueda del proceso "screen" para saber si ya existe o no
ps -el | grep `id $USER -u` | grep screen > /tmp/$tmp_file_name

#Contamos las líneas que hay en el fichero
a=`cat /tmp/$tmp_file_name | wc -l`

#Si Hay dos líneas significa que sólo el proceso GNOME-SCREEN se está ejecutando
if [ $a -eq 1 ]; then

#Ejecutamos el comando screen
screen -a

fi
#Si resulta que el comando GNOME-SCREEN no está funcionando, entonces
else

# Volvemos a guardar el resultado del comando grep en un fichero temporal
ps -el | grep `id $USER -u` | grep screen > /tmp/$tmp_file_name
#Contamos el número de líneas que hay en el fichero
a=`cat /tmp/$tmp_file_name | wc -l`
# Si el resultado es zero, significa que no existe ningún proceso screen arriba para el usuario.
if [ $a -eq 0 ]; then
#Por tanto, llamamos a screen
screen -a

fi
fi
#Finalmente borramos el fichero temporal que habíamos creado
rm /tmp/$tmp_file_name


Para crear el script hacemos lo siguiente:
$ sudo vim /home/foo/.autoconfig #Creamos un fichero oculto
# -pegamos el script anterior-
$ sudo chown foo:foo /home/foo/.autoconfig #el usuario y el grupo del fichero
$ sudo chmod u+x /home/foo/.autoconfig #asignamos permiso de ejecución para el usuario

Bien! Ya tenemos el script creado y listo para funcionar. Ahora queremos que éste script se ejecute cada vez que FOO inicie sesión en el sistema. Para ello añadiremos una línea al fichero .bashrc
$ vim /home/foo/.bashrc
# añadimos una línea al final que ponga
"./.autoconfig" #sin las comillas, claro

Por último nos queda configurar "screen". Con el script lo entendereis muy fácil:

#FICHERO CONFIGURACIÓN SCREEN .screenrc
#Activamos el modo multiusuario
multiuser on
#Configuramos el usuario que podrán visualizar la consola compartida
acladd inedit

Para creaer el fichero de configuración hacemos lo siguiente:
$ sudo vim /home/foo/.screenrc #Creamos el fichero
# -pegamos el fichero de configuración anterior-
$ sudo chown foo:foo /home/foo/.screenrc #Cambiamos al propietario del fichero

Estupendo, ahora ya podemos hacer la prueba. Cómo? Muy fácil.
Abrimos un terminal, con nuestro usuario actual (inedit):
inedit@wally:/$ su foo #cambiamos de usuario. Ponemos el password de foo
foo@wally:/$ echo hola #ejecutamos algo...

Abrimos otro terminal y ejecutamos lo que sigue:
inedit@wally:/$ screen -r foo/ #muy importante poner el nombre de usuario del que se quiere ver la consola compartida acabado con una barra. Ej: usuario/ foo/ ...

Señorees. Ya tenemos lo que queríamos. Escribe lo que quieras en una consola que te va a aparecer automáticamente en la otra. Espero que todo esté claro. Si tienen dudas, problemas y demás, no duden en preguntar!

Para profundizar. Links sobre screen:

No hay comentarios:

Publicar un comentario