Ejecutar programas X en otra máquina viéndolos en local

networking
A veces se necesita ejecutar un programa con interfaz gráfica que reside en una máquina distinta y queremos verlo en la máquina que estamos. Esta receta explica cómo conseguirlo sin tener que abrir una sesión X ni tener que utilizar un “escritorio remoto” como vnc.

Método 1: Exportar display

El método ‘clásico’ cuando queremos ejecutar un programa en una máquina remota y ver su interfaz en nuestro cliente X local es:

user@local:~$ xhost remoto
remoto being added to access control list
user@local:~$

Con eso se consigue que el servidor X, que corre en nuestra máquina, acepte conexiones externas de la máquina “remoto”. Pero si queremos que admita conexiones de cualquier máquina hay que poner:

user@local:~$ xhost +
access control disabled, clients can connect from any host
user@local:~$

Aunque esto puede suponer un problema de seguridad grave.

Ahora accede a la máquina remota con telnet o algo similar y exporta el ‘display’ para aplicaciones X.

user@remoto:~$ export DISPLAY=local:0
user@remoto:~$

La instrucción export declara una variable de entorno de la shell (no tiene nada que ver con la expresión exportar display).

Con esto, la aplicación X sabrá que debe utilizar el servidor X de la máquina llamada ‘local’ en lugar de usar el de la máquina en la que se ejecuta. Puedes comprobar que funciona con algo como:

user@remoto:~$ xeyes
user@remoto:~$

Con lo que deberías ver el clásico programilla de los ojos en la máquina local.

Método 2: ssh

El servidor ssh es capaz de gestionar automáticamente la conexión X siempre que servidor y cliente estén configurados adecuadamente.

Edita el fichero /etc/ssh/sshd_config del servidor y haz la siguiente modificación, que sirve para que el servidor ssh remoto devuelva el tráfico X11.

  X11Forwarding = yes

Edita el fichero /etc/ssh/ssh_config del cliente y haz la siguiente modificación, Esto hace que el cliente ssh local solicite el tráfico X11.

  ForwardX11 = yes

Como alternativa a esto, el usuario puede solicitarlo por línea de comando al hacer la conexión:

ssh -X remoto

Si lo haces en las dos máquinas, podrás utilizar este mecanismo en ambos sentidos. Sólo queda reiniciar el servidor con:

root@remoto:~# /etc/init.d/ssh restart
root@remoto:~#

Y ya tienes el efecto deseado, compruébalo con xeyes… (por ejemplo)

Enlaces