16.11.12

VNC antes del login en linux (tambien con gdm3...) - error "XOpenDisplay failed (:0)"


vnc es una de las mas populares herramientas de administracion remota, ciertamente hay otras mejores pero ninguna tan standard. corre perfectamente tanto en linux como windows con una configuracion bastante sencilla y no requiere de servidores intermediarios en la conexion.

el protocolo fue desarrollado originalmente por olivetti y oracle y tanto el original como muchas versiones modernas son open source y estan bajo licenci GNU, a pesar de que hay versiones que suman caracteristicas no propias del protocolo como la transferencia de archivos y otras. vnc basicamente usa el framebuffer remoto transmitiendo eventos de mouse y teclado y recibiendo los refrescos de la pantalla del servidor.

para windows se debe instalar alguna de las versiones para usarlo, una de las mas usadas es el realVNC. en la mayoria de los linux viene como opcion del sistema en preferences->remote desktop, solo hay que activarlo y ya esta corriendo.


VNC antes del login

en linux podemos hacer casi todo desde la consola, incluido el uso de aplicaciones graficas abriendo una sesion de ssh con X, pero en contadas ocasiones necesitamos tener acceso full al escritorio remoto por alguna razon y entonces nos encontramos con el problema.

en windows vnc se lanza como servicio antes de loguear y por lo tanto podemos conectar y acceder facilmente a la pantalla de logueo como si estuvieramos delante de la maquina. en linux el server se lanza recien despues de loguear el equipo, con lo cual necesitamos alguien fisicamente para que se active, lo cual no es lo ideal la mayoria de las veces...

entre las versiones disponibles este ejemplo usa x11vnc por ser la que viene instalada por default en la mayoria de los sistemas. dando por sentado que ya esta instalada logueamos por ssh y tratamos de lanzarla sin opciones, lo cual enseguida nos tira entre otras cosas:

XOpenDisplay failed (:0)

lo cual nos dice que vnc no pudo conectar con el display y por lo tanto no se pudo lanzar... simplemente no tiene autorizacion para hacerlo.

esta autorizacion esta en el clasico archivo .Xauthority que por lo gral se encuentra en el home del usuario. ahi se almacena la famosa MIT-MAGIC-COOKIE que es requerida para la autenticacion y sin la cual nos quedamos siempre en el error anterior. lo que debemos hacer entonces es pasarle como parametro la ruta al archivo con el modificador auth de alguna de estas maneras segun donde este ubicado:

gdm:     -auth /var/gdm/:0.Xauth
            -auth /var/lib/gdm/:0.Xauth
kdm:     -auth /var/lib/kdm/A:0-crWk72
            -auth /var/run/xauth/A:0-crWk72
xdm:     -auth /var/lib/xdm/authdir/authfiles/A:0-XQvaJk
dtlogin:  -auth /var/dt/A:0-UgaaXa

quedando por ejemplo:

#x11vnc -auth /var/gdm/:0.Xauth (para gdm)


el "problema" con gdm3

hasta ahi todo esta bastante claro pero el problema lo encontramos cuando migramos a un sistema con gdm3 donde no podemos encontrar el famos archivo en ninguna de las rutas usuales. la razon es que se genera con un nombre aleatorio en cada logueo y se ubica en:

/var/run/gdm3/auth-for-locvtvs-gdm-XXXXXX/database

donde XXXXXX cambia en cada reinicio, por lo cual no podemos simplemente meter siempre la misma linea de comando sino que debemos saber puntualmente el nombre cada vez. para conocerlo podesmos hacer un ps para buscarla entre los modificadores de Xorg:

ps aux | grep auth

y una vez conocida lanzarlo de esta forma:

x11vnc -auth /var/run/gdm3/auth-for-Debian-gdm-XXXXXX/database

o aun mejor:

x11vnc -usepw -auth /var/run/gdm3/auth-for-Debian-gdm-8ixCen/database

para usar la password definida anteriormente ;)


automatizacion

el problema del cambio de nombre nos complica el tema de poder automatizarlo por medio de un script, para hacerlo debemos extraer la ruta cada vez que se inicia el sistema. en este caso podriamos usar algo asi:

ps ax | grep auth | awk '/gdm3/ { print $13 }'

esto meterlo en una variable:

variable=$(ps ax | grep auth | awk '/gdm3/ { print $13 }')
x11vnc -usepw -auth "$variable"

y agregarlo al inicio del sistema para que lo lance automaticamente.

No hay comentarios: