Escritorios y Aplicaciones X11 remotas con GNU/Linux (X11 / Ssh)
September 30th, 2008 by BusindrePara plataformas GNU/Linux encontramos diversas aplicaciones que permiten usar programas gráficos que se encuentran en otra máquina remota Linux, como si fueran programas propios. En este post vamos a ver como se puede realizar este tipo de conexiones usando el mínimo de aplicaciones posible, únicamente usando el servidor X11 y lo que sus herramientas nativas nos ofrecen, por lo que podría usarse con cualquier sistema GNU/Linux que tenga instalado un servidor gráfico X11. En la actualidad este tipo de cosas se pueden hacer con distinto software, que además añade nuevas funcionalidades, como puede ser FreeNX, VNC, LTSP,.. Lo cierto es que la mayoría de estos sistemas usan el mismo mecanismo que mostramos a continuación, pero sumándole entre otras cosas, protocolos del tipo ssh (Seguridad) y mecanismos de compresión para el protocolo X11 que lo hacen más veloz.
El Sistema X Window de GNU/Linux (X11) es un sistema de ventanas para GNU/Linux y otros Unix que tiene la característica de poder usarse en red. Esta propiedad hace referencia al "DISPLAY", que no es más que una variable de entorno para averiguar a qué pantalla deben enviarse los gráficos, esta variable es consultada por las aplicaciones gráficas de Xwindows al ejecutarlas. El poder arrancar aplicaciones o escritorios de forma remota, permite utilizar la potencia de otra CPU externa mientras desde nuestro ordenador manejamos la aplicación gráficamente. Todas las aplicaciones X Window, como pueden ser Gimp, Amsn, Aterm, konqueror, Firefox, Kde, Gnome o cualquier otro programa gráfico, son clientes de que se conectan a un servidor gráfico, el servidor X.
La función de este servidor X es comunicarse con el hardware gráfico, dibujar las imágenes en la pantalla, leer las entradas del ratón y teclado. Los clientes (Programas) envían al servidor instrucciones sobre cómo pintar cuadros y botones; El servidor a cambio les envía los eventos de ratón y teclado. El cliente busca en la variable de entorno DISPLAY la ubicación del servidor gráfico, si no la encuentra o carece de valor, este intenta conectarse al servidor X11 local.
Existen dos tipos de aplicaciones dedicadas a controlar los permisos en lo relativo al entorno gráfico, estas son xhost y xauth, pero no entraremos en detalles sobre cada una de ellas, nosotros usaremos xhost para dar permisos pero sin profundizar sobre ello. Para empezar proponemos el siguiente escenario de dos hosts, pero realmente se pueden usar varios.
Host A: 192.168.2.33
Host B: 192.168.2.19
* Arrancando aplicaciones propias desde (A) sobre otra máquina (B)
Máquina A:
A$ export DISPLAY=192.168.2.19:0
A$ comando
Máquina B
B$ xhost +
NOTA: Al exportar la variable en una terminal, todas las aplicaciones que queramos se manejen desde B, deben ejecutarse en esa misma consola. La máquina B debe ejecutar el comando en las X, NO en una tty.
* Arrancando un escritorio de un ordenador (A) sobre otra máquina (B)
Máquina A:
A$ export DISPLAY=192.168.2.19:0
A$ comando
Para arrancar un determinado escritorio debemos seleccionar debidamente el comando que lo arranca:
A$ enlightenment_start
A$ starkde
A$ startxfce4
A$ gnome-session
A$ fluxbox
A$ icewm
Máquina B:
En este host debemos tener activado un servidor X11 sobre el que ejecutar el escritorio, más adelante veremos como hacerlo mediante ssh de forma breve.
En una tty ejecutamos lo siguiente:
B$ echo xhost +192.168.2.33 > $HOME/.bashrc
B$ xinit /usr/bin/xterm -- :0
Al insertar el comando xhost +192.168.2.33 le estamos dando permisos al host 192.168.2.33 para que ejecute aplicaciones en el DISPLAY de la maquina B. El comando Xinit arranca un servidor gráfico X11 con una terminal xterm, la cual nos permite poder ejecutar comandos sobre ese mismo PC a la vez que da permisos de forma automática gracias al comando xhost + del .bashrc. El primer paso no es obligatorio realizarlo, nosotros lo pusimos para automatizar el proceso, pero vale con usar la xterm que muestra xinit para insertar el comando xhost + y dar permisos. Una vez realizado esto, la máquina B esta dispuesta para recibir el manejo de un escritorio.
El comando xinit /usr/bin/xterm -- :6565 genera estos procesos en la máquina B:
X :6565
xterm -geometry +1+1 -n login
Esto quiere decir que estamos usando el display :6565 en la maquina B, por lo que para poder conectarnos a el, en la maquina A necesitaríamos exportar la variable indicándole el DISPLAY correcto (6565)
export DISPLAY=192.168.2.19:6565
En caso de no acertar con el DISPLAY, nos encontraremos con este tipo de mensajes:
Error: Can't open display: 192.168.2.19:XXX
NOTA: Si usamos wireshark o cualquier otro tipo de sniffer, veremos que el servidor de X usa TCP para conectar al cliente con el servidor. Cuando el servidor X11 se encuentra en el mismo host que el cliente (DISPLAY=:0.0 o DISPLAY=localhost:0.0), X11 utiliza UNIX Domain Sockets para comunicarse.
Cuando se establecen conexiones ssh con intención de arrancar aplicaciones gráficas (Opcionesde ssh -X ó -Y) el DISPLAY adquiere un valor de "localhost:10.0", entonces el servidor Ssh crea un UNIX Domain Socket correspondiente al display 10. Cuando un cliente ejecuta operaciones X11 sobre ese display, el servidor SSH las encapsula y las manda a través del túnel Ssh al otro extremo, donde el cliente SSH las desencapsula y las manda al servidor X11. Todo esto sin utilizar X11 sobre TCP, lo cual lo hace algo más veloz.
NOTA: Una forma de comprobar si la máquina a la que conectamos permite el uso de "X11 Forwarding" es mirar el valor de la variable DISPLAY ($ echo $DISPLAY). Si contiene como valor "localhost:10.0" una vez estemos logueados en el server vía ssh, es que lo permite. De encontrar vacía la variable DISPLAY es indicativo de que el fichero sshd_config del servidor al que estamos conectados, no permite el arranque de aplicaciones X de forma remota (X11 forwarding) y debe ser modificado si queremos visualizar en "local" sus aplicaciones gráficas.
* Arrancando aplicaciones de una máquina (B) sobre nuestra máquina (A) usando Ssh
Maquina A:
A$ ssh -X busi@192.168.2.19 -p 7777
A$ abiword
Máquina B:
Solo debe tener configurado correctamente el fichero sshd_config en la maquina B para permitir el uso de las X (X11 forwarding).
NOTA: Se da por supuesto que en la máquina A hay un escritorio o gestor de ventanas arrancado. En la maquina B no es necesario que tengas el servidor X11 arrancado.
* Arrancando un escritorio de un ordenador (B) sobre nuestra maquina (A) usando Ssh
Maquina A:
Partiendo de una tty:
A$ xinit /usr/bin/xterm -- :0
Sobre esa terminal que nos muestre en las X arrancadas:
A$ ssh -Y busi@192.168.2.19
A$ comando
NOTA: De querer ejecutar el escritorio en otro display, por ejemplo por que tengamos uno ocupado, solo tenemos que variar el comando y cambiar el 0 por un 1 o 2, 3,4,5,..
Máquina B:
Solo debe tener configurado correctamente el fichero sshd_config para permitir el uso de las X (X11 forwarding)
NOTA: Se da por supuesto que en la máquina A en un principio no hay un escritorio o gestor de ventanas arrancado, de haberlo deberíamos modificar el valor del display como decimos en la NOTA. Una vez realicemos el comando xinit ya tenemos el servidor X11 en el display indicado en espera de un escritorio. En la máquina B no es necesario que se tengan las X arrancadas.
Prestemos especial atención a que indicamos la opción -Y de ssh cuando queremos arrancar escritorios o gestores de ventanas, esto es debido a que dicha opción no está sujeta a las extensiones de seguridad de X11 (X11 SECURITY extension controls) que impedirían arrancarlos.
Si queremos arrancar aplicaciones propias sobre un escritorio remoto que estemos usando, o bien usamos la consola xterm de las X que arrancamos con xinit, o bien, salimos a una Tty y le indicamos el display donde queremos ejecutar las aplicaciones, veamos un ejemplo:
La Maquina A esta ejecutando un escritorio remoto en el display :1 por medio de ssh. Si queremos arrancar una aplicación propia de la maquina A podemos seguir este procedimiento:
A$ ps aux | grep -i "X :"
root 4606 1.0 4.6 76444 71416 tty7 SLs+ Sep29 7:35 X :0 -auth /home/busi/.serverauth.4589
root 11249 9.5 1.8 33100 28720 tty8 SLs+ 01:24 5:44 X :1
Estemos en una tty o en otro display, solo deberíamos ejecutar lo siguiente:
A$ export DISPLAY=:1
A$ comando
Con esto el programa se ejecutara sobre el display 1 en el cual se está usando un escritorio remoto, por ejemplo se podrían tener dos gkrellms, uno que muestre información sobre la maquina remota y otro sobre la local, todo en el mismo escritorio. Para terminar dejamos un screenshot de un escritorio formado por lo siguiente:
- Kde (Remoto, se ejecuta desde la maquina A)
- Fluxbox (Remoto, se ejecuta desde la maquina A)
- Gkrellm (Local, Se ejecuta desde el mismo B)
Enlace de Interés: http://www.busindre.com/varios-servidores-x11-de-forma-simultanea/
Posted in How To |

October 7th, 2008 at 4:22 am
[...] Enlace de Interés: http://www.busindre.com/escritorios-y-aplicaciones-x11-remotas-con-gnulinux-x11-ssh/ [...]