Ir a contenido

Ejecutar aplicaciones gráficas en remoto desde la línea de comandos


Introducción

Vamos a ver como ejecutar aplicaciones con interfaz gráfico que están instaladas en una máquina remota pero que quieres verlas directamente en tu ordenador local.
Como prerequisito las máquinas remotas serán sistemas GNU/LINUX o UNIX.
En sistemas window$ también se tiene que poder hacer, probar suerte buscando información sobre seamless RDP.

Controlar las aplicaciones de una máquina remota sin tener que estar frente a ella no tiene mucho interés para un usuario normal, pero para aquel que hace cosas más avanzadas es el pan de cada día.
En sistemas LINUX/UNIX es siempre imprescindible SSH. Eso nos proporciona una consola en modo texto. Trabajar en modo texto siempre es muy cómodo, porque no hay sensación de lejanía en la respuesta del equipo remoto, es como trabajar directamente sobre él.
En cuanto pasamos a querer controlar aplicaciones en máquinas remotas de forma gráfica la cosa se torna incómoda. La comodidad a la hora de trabajar se reduce porque la información tarda mucho en ir y volver. Es como vivir en modo Matrix. Tu te mueves a una velocidad normal, pero lo que ves en la pantalla se mueve a la velocidad de un erizo.

Por eso hay que aligerar las cosas. No es lo mismo querer tener delante todo un escritorio que usar sólo una aplicación. Con sólo una aplicación la cosa se hace llevadera. Esto es lo que voy a explicar cómo hacer.
En el caso de querer usar una sesión completa la cosa depende de si la otra máquina esta en tu red local o una red a través de la red Internet.
En tu propia red te puede valer cualquier servidor VNC o XDMCP. Aunque siempre mejor NX.
A través de la Internet te queda NX. NX es un protocolo optimizado para conexiones X11/XDMCP.

Método Fetén

Para permitir que todo funciones de forma óptima y SSH realice automáticamente la parte responsable de securizar flujos de datos (gráficos y textuales) hay que modificar primero el servidor SSH de la máquina remota (fichero /etc/ssh/sshd_config). Activaremos las dos variables indicadas. Activar estas opciones conllevan ciertos riesgos de seguridad.

/etc/ssh/sshd_config
X11Forwarding yes
AllowTcpForwarding yes

Ahora basta con conectarnos usando la opción -X (X11 forwarding) y -Y (X11 trusted forwarding) del cliente SSH. En Debian -Y es una opción que funciona por defecto si no se especifica nada en otro sitio (~/.ssh/config, /etc/ssh/ssh_config).

usuario@LOCAL:~$ echo $DISPLAY
:0.0
usuario@LOCAL:~$ SSH -Y usuario@maquina-remota
Password:
LINUX maquina-remota 2.6.18-3-686 \#1 SMP Mon Dec 4 16:41:14 UTC 2006 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
No mail.
Last login: Mon Mar 5 03:55:53 2007 from XX.XX.XX.XX
usuario@maquina-remota:~$ echo $DISPLAY
localhost:10.0
usuario@maquina-remota:~$ xlogo
[Por pantalla se muestra una ventana con el logotipo X]
usuario@maquina-remota:~$ exit
logout
Connection to XY.XY.XY.XY closed.

Método algo falla (o, no te enteras capullo)

Este método se daba cuando aun no comprendía cómo funcionaba todo el tinglao este de redirecciones de SSH, etc. Pero lo considero útil de exponer. Porque se puede necesitar para una máquina a la que no tengas acceso de superusuario para modificar configuraciones. O porque tienes problemas con su en tu propia máquina.

Qué hacer en la máquina local

Para podernos conectar gráficamente nos valemos de la opción -X (X11 forwarding) y -Y (X11 trusted forwarding) del cliente SSH. Si usas estas opciones de conexión te debería dar igual si hay cortafuegos de por medio. En Debian -Y es una opción que funciona por defecto si no se especifica nada en otro sitio (~/.ssh/config, /etc/ssh/ssh_config).

Si estamos en window$ debemos tener un servidor X local para que se comunique con él la aplicación gráfica remota (que hace de cliente X remoto). Esto lo logramos instalando Cygwin. Cuando nos pidan las aplicaciones que va a instalar instalamos xorg/xfree86 y también el cliente SSH.

Una vez todo listo con el siguiente comando podremos ejecutar aplicaciones gráficas remotas

usuario@LOCAL:~$ SSH -X -Y usuario@maquina_remota

Si se muestra un error (lo normal) hay que editar la configuración del servidor X para permitir que acepte peticiones y conexiones TCP. Por defecto nuestro gestor de pantalla sólo maneja puertos tipo UNIX, que pecan de ser sólo de uso local.
Una opción es usar el programa de configuración del gestor de pantalla(gdm, kdm, …) para permitir conexiones TCP. Para gdm es gdmsetup.
Otra es modificar la variable DisallowTCP en el fichero de configuración del gestor de pantalla. Para gdm es /etc/gdm/gdm.conf.

/etc/gdm/gdm.conf
# If true this will basically append -nolisten TCP to every X command line,
# a good default to have (why is this a “negative” setting? because if
# it is false, you could still not allow it by setting command line of
# any particular server). It’s probably better to ship with this on
# since most users will not need this and it’s more of a security risk
# then anything else.
# Note: Anytime we find a -query or -indirect on the command line we do
# not add a “-nolisten TCP”, as then the query just wouldn’t work, so
# this setting only affects truly local sessions.
DisallowTCP=false

Además de permitir conexiones TCP hay que indicar quién las puede realizar.
Con xhost modificamos quien se puede conectar al servidor gráfico que se ejecuta actualmente. Permitimos que la máquina a la que nos vamos a conectar tenga acceso a nuestra sesión.

usuario@LOCAL:~$ xhost +maquina_remota

Qué hacer en la máquina remota

Puede que haya que retocar alguna regla del cortafuegos que tenga que ver con X11 o XDMCP. Depende de como se ejecute.

En teoría si hemos ejecutado SSH con -X -Y no habría que tocar nada de la variable DISPLAY, se haría automáticamente, pero por alguna razón yo en Debian tengo que modificarlo a mano (véis el porque de lo de que era un capullo).
Lo principal es indicar desde la línea de comandos remota dónde queremos que se vea la aplicación gráfica. Para ello hay que hacer uso de la variable de entorno DISPLAY que le indica a los programas cuál es su servidor X gráfico.

usuario@maquina-remota:~$ export DISPLAY=[maquina-local]:[display-servidor-X]

En caso de que tratemos de ejecutar alguna aplicación gráfica, por ejemplo xlogo, se debería mostrar el siguiente error.

usuario@maquina-remota:~$ xlogo
Xlib: connection to “[maquina-local]:[display-servidor-X]” refused by server
Xlib: No protocol specified
Error: Can’t open display: [maquina-local]:[display-servidor-X]
No se pudo abrir la pantalla porque el servidor X no se está ejecutando. [Mensaje en versión española]

Esto se debe a que tenemos que retocar el servidor X de nuestra máquina local. Hay que indicar a quién permitimos conectarse a nuestro servidor gráfico.
Si no se muestra el error es porque ya lo tenemos configurado de antemano. Si lo hemos modificado nosotros para que funcione así no hay problema, pero por defecto se debería mostrar el error anterior por cuestiones de seguridad.
El mensaje anterior puede resultar desconcertante para cualquier usuario de sistemas GNU/LINUX o UNIX que desconozca el uso y disfrute de la variable DISPLAY.
Puede que también se muestre este error en tu máquina local cuando te autenticas (logeas) como otro usuario mediante el comando su -

Ejemplo práctico

usuario@LOCAL:~$ SSH -X -Y usuario@maquina_remota
usuario@maquina-remota:~$ xlogo
Error: Can’t open display:
usuario@maquina-remota:~$ export DISPLAY=192.168.0.102
usuario@maquina-remota:~$ xlogo
Error: Can’t open display: 192.168.0.102
usuario@maquina-remota:~$ export DISPLAY=192.168.0.102:0
usuario@maquina-remota:~$ xlogo
Xlib: connection to “192.168.0.102:0.0″ refused by server
Xlib: No protocol specified
Error: Can’t open display: 192.168.0.102:0
usuario@maquina-remota:~$ exit
usuario@LOCAL:~$ xhost +192.168.0.1
192.168.0.1 being added to access control list
usuario@LOCAL:~$ SSH -X -Y usuario@maquina_remota
usuario@maquina-remota:~$ export DISPLAY=192.168.0.102:0
usuario@maquina-remota:~$ xlogo
[Por pantalla se muestra una ventana con el logotipo X]

Referencias interesantes:

Etiquetas: , , , , , , , , ,