Sesión X Window remota con SSH

Este método entunela las X mediante SSH, de manera que toda la información circula cifrada por la red, a diferencia del protocolo XDMCP que trasmite la información sin cifrar. SSH utiliza el puerto 22 TCP, por lo que tendremos que abrirlo en el firewall. (Puede usarse Telnet pero usaremos SSH por seguridad).

  • Abriremos una sesión X en el host cliente utilizando el comando xinit (no usaremos startx, ya que lanza el window manager):
    $ xinit

    Obtendremos una sesión X en la primera tty libre (si no tenemos otra sesión gráfica abierta será la terminal tty7) con un xterm abierto. En ese xterm ejecutaremos el comando:

    $ xhost +nombre_de_host

    Atención

    Nunca usaremos el comando xhost +, ya que permite a cualquier cliente conectarse y tomar el control de las X. Siempre especificaremos un host.

  • A continuación, abriremos una sesión SSH en el servidor desde cualquier terminal del host cliente, ejecutando en el host cliente el comando:
    $ ssh <IP_servidor>

    Por ejemplo:

    $ ssh 192.168.1.3
  • En la terminal SSH, estableceremos el valor de la variable DISPLAY, ejecutando el comando:
    $ export DISPLAY=<IP_host_cliente>:0

    Por ejemplo:

    $ export DISPLAY=192.168.1.2:0
  • Por último, ejecutaremos en la terminal SSH el comando que lanza el window manager (por ejemplo, icewm-session):
    $ icewm-session

    De esta manera obtendremos en la terminal tty7 la sesión X remota.

    En el host cliente tendremos activos los procesos servidor X (Xorg) y xterm, que cuelgan de xinit, y ssh:

    $ pstree
    init-+-
         |-login---bash-+-xinit-+-Xorg
                        |       |-xterm---bash
                        |-ssh

    Y en el servidor tendremos activo el proceso window manager (por ejemplo, icewm-session), que cuelga del demonio sshd:

    $ pstree
    init-+-
         |-sshd---sshd---bash---icewm-session
  • Si ya teníamos en el host cliente una sesión X local abierta, para iniciar una sesión X remota tendremos que especificar el DISPLAY tanto al lanzar xinit:
    $ xinit -- :1
    $ xhost +

    como al exportar la variable DISPLAY en la terminal SSH:

    $ export DISPLAY=192.168.1.2:1
    $ icewm-session

    Obtendremos una sesión X en la primera tty libre (por ejemplo la terminal tty8).

  • De la misma manera, si queremos abrir otra sesión X remota en el host cliente tendremos que especificar el DISPLAY tanto al lanzar xinit:
    $ xinit -- :2 &
    $ xhost +

    como al exportar la variable DISPLAY en la terminal SSH:

    $ export DISPLAY=192.168.1.2:2
    $ icewm-session

    Obtendremos una sesión X en la primera tty libre (por ejemplo la terminal tty9).

    En el host cliente tendremos activos los procesos:

    $ pstree
    init-+-
         |-login---bash-+-xinit-+-Xorg
         |              |       |-xterm---bash
         |              |-ssh
         |-login---bash-+-xinit-+-Xorg
                        |       |-xterm---bash
                        |-ssh

    Y en el servidor tendremos activos los procesos:

    $ pstree
    init-+-
         |-sshd-+-sshd---bash---icewm-session
                |-sshd---bash---icewm-session

8 pensamientos en “Sesión X Window remota con SSH

  1. David

    Muy buen texto, bien explicado. Aunque tengo una pregunta. ¿Desde Windows XP se puede tener acceso por SSH a un host con Gnu/Linux? Gracias.

    Responder
  2. Mikel

    Hola, estoy intentando seguir los pasos que marcas, pero tengo un problema. Al conectar remotamente por ssh e intentar cambiar el display mediante export DISPLAY=xxx.xxx.xxx:0.0 en realidad aunque por ssh al hacer un echo $DISPLAY vea que se ha cambiado bien el valor, si voy al ordenador al que me había conectado de forma remota mediante ssh, y ejecutar ahí el echo $DISPLAY me sale :0.0.
    Es decir, no lo ha cambiado aunque desde ssh me diga que sí. Si lo cambio de forma presencial el display en el ordenador remoto, sí que me funciona ya todo.
    ¿Sabes a qué se puede deber esto?
    Un saludo,
    Mikel

    Responder
  3. Iban martin

    He tenido algunos problemillas..
    $ xinit — :1 ———->funciona
    $ xhost + ———->funciona
    $ export DISPLAY=192.168.1.2:2 ———->funciona
    hasta aqui todo bien

    $ startxfc4 ————>No funciona :(
    $sudo startxfc4 ———->funciona

    Luego me doy cuenta que no tiene permiso en un archivo llamado .ICEauthority
    que esta en el directorio home de usuario. de 600 le cambio a 666
    $ startxfc4 ————>funciona

    ¿Si lo dejo con esos permisos me trae algun otro problema?
    Si cambio de terminal se pierde..¿Existe alguna manera de que no pierda?

    Cuando hago un pstree me sale algo asi.. No como a ti..
    $ pstree
    init-+-
    |-login—bash-+-xinit-+-Xorg
    |-xterm—bash—ssh
    ¿Estoy haciendo algo mal?
    Salu2

    Responder
  4. il Santi

    Muchísimas gracias… me sirvió espectacular, lo único que te faltó es que si ya existe una sesión X iniciada en el Display 0, hay que escribir

    #: xinit — :1 (o 2 o el número tty que se desee)

    y donde corresponda:

    #: export DISPLAY=:1 (o 2 o el número tty que se puso anteriormente)

    Saludos!

    Responder
  5. SEG

    Solo les quería comentar que esto me sirvio para conectarme remotamente con sesión gráfica a mi fedora 13 desde mi MAC con snow leopard.

    Así tal cual como viene aqui.

    De hecho no funcionó el google crome por ejemplo (lo despliega en localhost) pero jdownloader lo desplegó remotamente sin problemas…

    Saludos y gracias.

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>