Érase una vez,
DISPLAY=:0.0 totem /path/to/movie.avi
después de pasar a mi escritorio desde mi computadora portátil, el tótem se 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.
He buscado en Google esto, y por mi vida no puedo entender lo que se supone que debo hacer.
(VLC tiene una interfaz HTTP que funciona, pero no es tan conveniente como ssh).
El mismo problema surge cuando intento ejecutar esto desde un trabajo cron.
totem
no encuentra su cookie X, y debe establecerXAUTHORITY
el valor adecuado, es decir, el valor en su sesión normal en su escritorio. Lea Linux: wmctrl no puede abrir la pantalla cuando la sesión se inicia a través de ssh + screen para algunos antecedentes; también vea la respuesta relacionada Como root, ¿puedo iniciar un programa gráfico en el escritorio de otro usuario? .$XAUTHORITY
al~/.Xauthority
igual que todo el mundo espera que sea.Respuestas:
(Adaptado de Linux: wmctrl no puede abrir la pantalla cuando la sesión se inicia a través de ssh + pantalla )
PANTALLA y AUTORIDAD
Un programa X necesita dos piezas de información para conectarse a una pantalla X.
Se necesita la dirección de la pantalla, que es normalmente
:0
cuando está conectado localmente o:10
,:11
, etc, cuando está conectado de forma remota (pero el número puede cambiar dependiendo del número de conexiones X están activos). La dirección de la pantalla normalmente se indica en laDISPLAY
variable de entorno.Necesita la contraseña para la pantalla. Las contraseñas de visualización X se llaman 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 "pantalla
:42
tiene cookie123456
". El archivo de autoridad X normalmente se indica en laXAUTHORITY
variable de entorno. Si$XAUTHORITY
no está configurado, los programas lo usan~/.Xauthority
.Estás intentando actuar en las ventanas que se muestran en tu escritorio. Si eres la única persona que usa tu 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 tenía ningún problema antes porque las versiones anteriores de gdm usaban la configuración predeterminada, es decir, las cookies almacenadas en~/.Xauthority
).Obteniendo los valores de las variables
Aquí hay algunas formas de obtener los valores de
DISPLAY
yXAUTHORITY
:Puede iniciar sistemáticamente una sesión de pantalla desde su escritorio, tal vez automáticamente en sus scripts de inicio de sesión (desde
~/.profile
; pero hágalo solo si inicia sesión en X: pruebe siDISPLAY
está configurado en un valor que comience desde:
(eso debería cubrir todos los casos que probablemente encontrar)). En~/.profile
:Luego, en la sesión ssh:
También puede guardar los valores de
DISPLAY
yXAUTHORITY
en un archivo y recuperar los valores. En~/.profile
:En la sesión ssh:
Puede detectar los valores de
DISPLAY
yXAUTHORITY
desde 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 obtener las variables de entorno de/proc/$pid/environ
(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).Copiando las cookies
Otro enfoque (siguiendo una sugerencia de Arrowmaster ) es no intentar obtener el valor de
$XAUTHORITY
la sesión ssh, sino hacer que la sesión X copie sus cookies~/.Xauthority
. Dado que las cookies se generan cada vez que inicia sesión, no es un problema si mantiene valores obsoletos~/.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 tendrían que conectarse a su máquina de alguna manera, a menos que haya habilitado las conexiones X TCP (Debian las tiene desactivadas por defecto). 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 inicia sesión en su sesión X de escritorio, agregue las siguientes líneas
~/.xprofile
ao~/.profile
(o algún otro script que se lea cuando inicie sesión):¹ En principio, esto carece de una cita adecuada, pero en este caso específico
$DISPLAY
y$XAUTHORITY
no contendrá ningún metacarácter de shell.fuente
~/.xprofile
que solo debería ejecutarse durante el inicio de sesión X y hacer que se cree / actualice~/.Xauthority
con la información correcta. ¿Sería suficiente un enlace simbólico?~/.Xauthority
.xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -
en~/.xprofile
resolver el caso de múltiples $ DISPLAY?Resolví este problema agregando
a
~/.xprofile
. No sé si esto es completamente seguro (estaría muy interesado en saber qué piensa la gente con más conocimientos), pero supongo que es mucho mejor que desactivar el control de acceso (conxhost +
) como se sugiere comúnmente cuando google para este problemafuente
localuser
Las direcciones interpretadas por el servidor son completamente seguras. Debian incluso hace esto por defecto como parte del proceso de inicio de sesión (en/etc/X11/Xsession.d/35x11-common_xhost-local
). Consulte la página del manual de Xsecurity para obtener más detalles.xhost +
probablemente sea suficiente en la mayoría de los casos ...xhost(1)
yXsecurity(7)
para documentos). Por sí solo, este comando no permite ningún tipo de acceso remoto o reenvío X11 (para el cual generalmente se prefiere el mecanismo de "cookie mágica"xhost
).Necesitas
export DISPLAY=:0.0
fuente
Funciona para mí, debian wheezy -> ubuntu trusty.
Nota: en este caso, el servidor no ejecuta un administrador de pantalla, es una máquina virtual 'sin cabeza' sin tarjeta gráfica o monitor conectado.
La pantalla X en la computadora portátil muestra la salida de xterm ejecutándose en el servidor.
Depurar usando:
strace
derramará un montón de detalles sangrientos sobre lo que está haciendo, deberías ser capaz de adivinar dónde se atasca, esperando una conexión o lo que sea.En una linea ..
fuente