¿Qué es XDG_RUNTIME_DIR?

13

Mientras intentaba abrir Evince desde la línea de comando, me está dando un error

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

¿Cómo solucionar este problema?

Muhammad Iliyas
fuente
1
Cuéntanos más sobre tu sistema operativo.
DK Bose

Respuestas:

27

Primero lo primero: XDG_RUNTIME_DIR

Para responder a su primera pregunta, "¿Qué es XDG_RUNTIME_DIR?" , es una variable de entorno que se configura automáticamente cuando inicia sesión. Le dice a cualquier programa que ejecute dónde encontrar un directorio específico del usuario en el que pueda almacenar pequeños archivos temporales. Tenga en cuenta que XDG_RUNTIME_DIRestá establecido por pam_systemd(8) , por lo que en realidad no está relacionado con X (ejecutar programas gráficamente), que es el problema que parece tener.

Cómo solucionar problemas

Su segunda pregunta, "¿Cómo solucionar este problema?" es muy bueno Eso significa que está interesado no solo en cuál es la solución, sino también en cómo resolverlo usted mismo. Para comenzar, mire primero los primeros mensajes de error. En particular, buscar No protocol specifiedo WARNING **: Could not open X displaydebería mostrarle que el problema está en X (también llamado The X Windowing System ), que es cómo se muestran los programas gráficos en su pantalla. Saber eso debería plantear muchas preguntas de solución de problemas en su mente.

X PANTALLA

Su próxima pregunta podría ser, ¿qué es esta "pantalla X" que no puede abrirse? Una "pantalla" es la dirección de su pantalla. [*] Cualquier programa que quiera escribir en tu pantalla tiene que saber la dirección. Puede ver cuál es su pantalla X marcando la variable de entorno DISPLAY:

echo $DISPLAY

Y puede verificar qué sudopiensa que es su PANTALLA escribiendo:

sudo -s
echo $DISPLAY
exit

Si no muestra nada, entonces ese es el problema. (Ver arreglo a continuación).

XAUTHORITY

Pero, ¿qué DISPLAYpasa si ese no es el problema y está configurado correctamente sudo? Entonces podría preguntarse, ¿ tiene X algún tipo de permiso que impida que otros usuarios escriban en mi pantalla? Si pensabas eso, estarías en lo cierto, X tiene dos métodos principales de autorización: xauthy xhost. El más utilizado hoy en día es xauth(1) que utiliza la XAUTHORITYvariable de entorno. Nuevamente, verifiquemos si está configurado correctamente sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Si XAUTHORITYestá apuntando a un archivo en su directorio de inicio para usted, pero está en blanco cuando lo ejecuta sudo, entonces ese es el problema.

REVISIÓN: guardar las variables de entorno

Entonces, ¿cuál es la solución? Si no se guardan las variables de entorno DISPLAYo las de XAUTHORITYentorno sudo, puede indicarle a sudo(8) que conserve el entorno utilizando la -Eopción, de esta manera:

sudo -E evince

Una mejor manera: env_keep

Podrías preguntar, espera, si -Etodo funciona mágicamente, ¿por qué no es el predeterminado sudo? La respuesta es que es un peligro potencial para la seguridad. Las variables de entorno afectan la forma en que funcionan los programas y no desea que se exporten todos desde una cuenta de usuario a la raíz. La forma "correcta" de hacerlo es agregar la línea Defaults env_keep += "DISPLAY XAUTHORITY"al archivo sudoers(5) usando visudo(8) . Puede verificar qué variables de entorno conserva sudo ejecutando:

sudo sudo -V

(Sí, escribe sudodos veces). Recomiendo poner la línea no en el archivo de sudoers predeterminado ( /etc/sudoers), sino en un archivo local que no se sobrescribirá cuando actualice su sistema. Puedes hacerlo así:

sudo visudo -f /etc/sudoers.d/local 

Pero espera, ¿qué pasa si ninguno de los anteriores funciona?

Creo que esta es una respuesta bastante exhaustiva, pero si todavía tiene problemas, hay otra cosa que sugeriría. Puede usar xhost(1) para otorgar acceso a un usuario específico en el host local (su máquina) de esta manera,

xhost si:localuser:root

En este caso, estamos especificando rootcomo nombre de usuario, ya que esa es la cuenta que sudoejecuta programas como.


[*] : P: Solo tengo una pantalla, entonces ¿por qué una pantalla X necesita una "dirección"? R: Es porque X puede funcionar no solo en su máquina, sino a través de Internet. Con X , es fácil ejecutar programas en su máquina que aparecen en otros hosts de Internet y programas en otros hosts que aparecen en su pantalla (suponiendo que les dé permiso).

hackerb9
fuente
Gracias por la elaborada respuesta. Estoy seguro de que hay al menos algo nuevo en su respuesta para cada usuario. (Para mí: cómo conceder acceso a X a un usuario específico, que es mejor que la emisión xhost +para permitir el acceso universal.)
drumfire
3

XDG_RUNTIME_DIRes una variable de entorno establecida en su contexto X Windows, para que los programas puedan encontrar cosas. Usted ( neo) ha configurado el contexto gráfico.

Al intentar ejecutar evincecomo root, ha ingresado la condición en la que un usuario ( root) está intentando acceder a la neopantalla de otro usuario ( ). Esto se considera como algo malo.

Si decides que DEBES ejecutar un editor gráfico como root, lee man gksudo y utiliza gksudo.

Waltinator
fuente
comentario interesante ¿Sabes entonces cómo podría hacer algo como esto? journalctl -b -p err | wl-copyinforma Failed to connect to a Wayland serverque tiene sentido, pero suena tonto por el POV del usuario.
mh-cbon