Si tenemos acceso por SSH a otro ordenador, ambos con entorno gráfico, podemos redirigir la pantalla, el teclado y el ratón en ambos sentidos, es decir, podemos conseguir cosas como:

» aplicaciones remotas que se muestren en nuestro equipo » aplicaciones remotas que se muestren en el equipo remoto » aplicaciones locales que se muestren en el equipo remoto » recibir una captura de pantalla del equipo remoto » enviar una captura de pantalla de nuestro equipo al equipo remoto » mostrar una imagen remota en nuestro equipo » mostrar una imagen local en el equipo remoto

Aplicaciones remotas en el servidor gráfico local

Si queremos que un programa de un equipo remoto se ejecute en el servidor gráfico de nuestro equipo, una de las cosas que podemos hacer es configurar el servidor SSH del equipo remoto para que acepte el reenvío X11, o X11 Forwarding. De esta forma la conexión va cifrada y, además, tampoco debemos preocuparnos por el valor de la variable de entorno DISPLAY. Para que el servidor SSH permita el reenvío X11, deberemos asegurarnos de que en el archivo de configuración /etc/ssh/sshd_config aparece lo siguiente:

bash X11Forwarding yes

Si no estuviera, lo añadimos y reiniciamos el servicio. Ahora, iniciaremos una conexión SSH desde el cliente, utilizando el argumento -X de ssh:

bash $ ssh -C -X user@remotehost

El argumento -X permite reenviar el terminal gráfico. Se debe utilizar con cuidado, tal como lo indican en la página del manual. Un usuario del equipo remoto que pueda saltarse los permisos de archivo (para la base de datos de usuarios autorizados del servidor X) podría acceder al terminal gráfico de nuestro equipo a través de la conexión reenviada. Un atacante podría realizar acciones como por ejemplo monitorizar las pulsaciones de teclado. Por este motivo, el reenvío X11 está sujeto a varias restricciones por defecto según la política de seguridad de X11. Utilizando el argumento -Y se confía en el equipo remoto y no se llevan a cabo los controles ni se aplican estas restricciones.

Cuando ejecutemos una aplicación con interfaz gráfica, ésta se abrirá en nuestro equipo.

bash remotehost$ xeyes &

Aplicaciones remotas en el servidor gráfico remoto

Si lo que queremos es abrir un programa con interfaz gráfica del equipo remoto, pero esta vez en el servidor gráfico del equipo remoto, no es necesario recurrir al reenvío X11. Lo único que hay que hacer, una vez iniciada la sesión en el equipo remoto, es modificar el valor de la variable de entorno DISPLAY:

bash remotehost$ export DISPLAY=:0

Cuando lancemos una aplicación con interfaz gráfica instalada en el equipo remoto, ésta se abrirá en el servidor gráfico del equipo remoto.

En lugar de exportar la variable, podemos definirla únicamente para una aplicación en concreto:

bash $ DISPLAY=:0 xterm

Aplicaciones gráficas locales en el entorno gráfico remoto

Podemos utilizar lo visto en los dos casos anteriores para conseguir que una aplicación de nuestro equipo se ejecute en el servidor gráfico remoto a través de SSH. Necesitaremos tener un servidor SSH corriendo en nuestro equipo.

Primero, establecemos un túnel inverso entre nuestro equipo y el equipo remoto. Esto quiere decir que se creará una redirección en el puerto 8000 del equipo remoto al servidor SSH de nuestro equipo.

bash $ ssh -R 8000:localhost:22 remoteuser@remotehost

Una vez iniciada esta conexión, modificaremos el valor de la variable DISPLAY y nos conectaremos al puerto local 8000 que redirige a nuestro equipo:

bash remotehost$ DISPLAY=:0 ssh -C -X -p8000 user@localhost

Cuando hayamos iniciado sesión en nuestro equipo será como tener otro terminal abierto, sólo que las aplicaciones que ejecutemos en éste se mostrarán en el equipo remoto.

En esta página podemos encontrar una comparativa del consumo de ancho de banda de diferentes programas a través del túnel seguro.

Obtener una captura del escritorio remoto

Si lo que queremos es hacer una captura del escritorio del equipo remoto, podemos utilizar el comando import:

bash $ ssh -C user@remotehost "DISPLAY=:0.0 import -window root -format png -" | display -format png -

En lugar de visualizarla directamente, podríamos guardarla en el equipo remoto y luego copiar las capturas con scp.

Otro comando sería scrot, disponible en los repositorios:

bash $ ssh -C user@remotehost "DISPLAY=:0.0 scrot -z - | display -

Si está puesto el protector de pantalla, por ejemplo, si la captura sale en negro, deberemos matar el proceso para poder ver el escritorio.

bash $ ssh user@remotehost "pkill gnome-screensaver"

Mostrar una captura de nuestro escritorio en el equipo remoto

El caso contrario al anterior.

bash $ import -window root -format png - | ssh -C user@remotehost "DISPLAY=:0.0 display -format png -"

Otra forma sería guardar la captura en un fichero, enviarlo y luego abrir una aplicación en el equipo remoto:

bash $ import -window root -format png screenshot.png $ scp screenshot.png user@remotehost:~ $ ssh user@remotehost "DISPLAY=:0 eog screenshot.png"

Mostrar imágenes del equipo remoto

De la misma forma que realizamos una captura, podemos enviarnos una imagen y visualizarla directamente:

bash $ ssh -C user@remotehost "cat screenshot.png" | display -format png -

Mostrar imágenes de nuestro equipo en el equipo remoto

Podemos conseguir que se habrá una aplicación remota que muestre una imagen de nuestro equipo:

bash $ cat screenshot.png | ssh -C user@remotehost "DISPLAY=:0 display -format png -"


Entradas relacionadas