Érase una vez,
DISPLAY=:0.0 totem /path/to/movie.avi
después de ingresar a mi escritorio desde mi computadora portátil, Totem reproduciría movie.avi
en mi escritorio.
Ahora da el error:
No protocol specified Cannot open display:
Reinstalé Debian squeeze cuando se estabilizó en ambas computadoras y supongo que rompí la configuración.
Busqué en Google sobre esto, y por mi vida no puedo averiguar qué se supone que debo hacer.
(VLC tiene una interfaz HTTP que funciona, pero no es tan conveniente como ssh).
El mismo problema surge cuando trato de ejecutar esto desde un trabajo cron.
Respuesta aceptada:
(Adaptado de Linux:wmctrl no puede abrir la pantalla cuando la sesión se inicia a través de ssh+screen)
PANTALLA y AUTORIDAD
Un programa X necesita dos piezas de información para conectarse a una pantalla X.
-
Necesita la dirección de la pantalla, que normalmente es
:0
cuando está conectado localmente o:10
,:11
, etc. cuando inicia sesión de forma remota (pero el número puede cambiar dependiendo de cuántas conexiones X estén activas). La dirección de la pantalla normalmente se indica en elDISPLAY
variable de entorno. -
Necesita la contraseña para la pantalla. Las contraseñas de pantalla X se denominan cookies mágicas . Las cookies mágicas no se especifican directamente:siempre se almacenan en archivos de autoridad X, que son una colección de registros de la forma "display
:42
tiene cookie123456
”. El archivo de autoridad X normalmente se indica en elXAUTHORITY
Variable ambiental. Si$XAUTHORITY
no está configurado, los programas usan~/.Xauthority
.
Está intentando actuar sobre las ventanas que se muestran en su escritorio. Si es la única persona que usa su máquina de escritorio, es muy probable que el nombre para mostrar sea :0
. Encontrar la ubicación del archivo de autoridad X es más difícil, porque con gdm configurado en Debian squeeze o Ubuntu 10.04, está en un archivo con un nombre generado aleatoriamente. (No tuvo ningún problema antes porque las versiones anteriores de gdm usaban la configuración predeterminada, es decir, cookies almacenadas en ~/.Xauthority
.)
Obteniendo los valores de las variables
Aquí hay algunas formas de obtener los valores de DISPLAY
y XAUTHORITY
:
-
Puede iniciar sistemáticamente una sesión de pantalla desde su escritorio, quizás automáticamente en sus scripts de inicio de sesión (desde
~/.profile
; pero hazlo solo si inicias sesión con X:prueba siDISPLAY
se establece en un valor que comienza con:
(que debería cubrir todos los casos que es probable que encuentre)). En~/.profile
:case $DISPLAY in :*) screen -S local -d -m;; esac
Luego, en la sesión ssh:
screen -d -r local
-
También puede guardar los valores de
DISPLAY
yXAUTHORITY
en un archivo y recuperar los valores. En~/.profile
:case $DISPLAY in :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;; esac
En la sesión ssh:
. ~/.local-display-setup.sh screen
-
Podrías detectar los valores de
DISPLAY
yXAUTHORITY
de un proceso en ejecución. Esto es más difícil de automatizar. Debe averiguar el PID de un proceso que está conectado a la pantalla en la que desea trabajar, luego obtenga las variables de entorno de/proc/$pid/environ
(eval export $(</proc/$pid/environ tr \0 \n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Copiar las cookies
Otro enfoque (siguiendo una sugerencia de Arrowmaster) es no intentar obtener el valor de $XAUTHORITY
en la sesión ssh, pero en lugar de hacer que la sesión X copie sus cookies en ~/.Xauthority
. Dado que las cookies se generan cada vez que inicia sesión, no hay problema si mantiene valores obsoletos en ~/.Xauthority
.
Puede haber un problema de seguridad si se puede acceder a su directorio de inicio a través de NFS u otro sistema de archivos de red que permita a los administradores remotos ver su contenido. Todavía necesitarían conectarse a su máquina de alguna manera, a menos que haya habilitado las conexiones X TCP (Debian las tiene desactivadas de manera predeterminada). Entonces, para la mayoría de las personas, esto no se aplica (sin NFS) o no es un problema (sin conexiones X TCP).
Para copiar cookies cuando inicie sesión en su sesión de escritorio X, agregue las siguientes líneas a ~/.xprofile
o ~/.profile
(o alguna otra secuencia de comandos que se lee cuando inicia sesión):
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ En principio, esto carece de las comillas adecuadas, pero en este caso específico $DISPLAY
y $XAUTHORITY
no contendrá ningún metacarácter de shell.