Qu'est-ce que XDG_RUNTIME_DIR?

14

Pendant que j'essayais d'ouvrir Evince à partir de la ligne de commande, cela me donne une erreur

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:

Comment résoudre ce problème?

Muhammad Iliyas
la source
1
Parlez-nous de votre système d'exploitation.
DK Bose

Réponses:

29

Tout d'abord: XDG_RUNTIME_DIR

Pour répondre à votre première question, "Qu'est-ce que XDG_RUNTIME_DIR?" , il s'agit d'une variable d'environnement qui est définie automatiquement lorsque vous vous connectez. Elle indique à tout programme que vous exécutez où trouver un répertoire spécifique à l'utilisateur dans lequel il peut stocker de petits fichiers temporaires. Notez que cela XDG_RUNTIME_DIRest défini par pam_systemd(8) , donc ce n'est pas réellement lié à X (exécution graphique des programmes), qui est le problème que vous semblez avoir.

Comment dépanner

Votre deuxième question, "Comment résoudre ce problème?" est un très bon. Cela signifie que vous souhaitez non seulement savoir quel est le correctif, mais aussi comment le découvrir par vous-même. Pour commencer, regardez d'abord les premiers messages d'erreur. En particulier, la recherche de No protocol specifiedou WARNING **: Could not open X displaydevrait vous montrer que le problème vient de X (également appelé le système de fenêtrage X ), c'est-à-dire comment les programmes graphiques sont affichés sur votre écran. Le savoir devrait soulever de nombreuses questions de dépannage dans votre esprit.

AFFICHAGE X

Votre prochaine question pourrait être, quel est cet "affichage X" qui ne peut pas s'ouvrir? Un "affichage" est l'adresse de votre écran. [*] Tout programme qui souhaite écrire sur votre écran doit connaître l'adresse. Vous pouvez voir ce qu'est votre affichage X en vérifiant la variable d'environnement DISPLAY:

echo $DISPLAY

Et vous pouvez vérifier ce que sudopense votre DISPLAY en tapant:

sudo -s
echo $DISPLAY
exit

S'il ne montre rien, c'est bien le problème. (Voir correctif ci-dessous).

XAUTHORITY

Mais que se passe-t-il si ce n'est pas le problème et que le DISPLAYparamètre est correctement défini sudo? Ensuite, vous vous demandez peut-être, X a-t-il une sorte d'autorisations qui empêchent les autres utilisateurs d'écrire sur mon écran? Si vous pensiez cela, vous auriez raison, X a deux principales méthodes d'autorisation: xauthet xhost. Le plus couramment utilisé aujourd'hui est xauth(1) qui utilise la XAUTHORITYvariable d'environnement. Encore une fois, vérifions s'il est correctement défini dans sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Si XAUTHORITYpointe vers un fichier dans votre répertoire personnel pour vous, mais qu'il est vide lorsque vous exécutez sudo, c'est le problème.

CORRECTIF: enregistrer les variables d'environnement

Alors, quelle est la solution? Si la DISPLAYou les XAUTHORITYvariables d'environnement ne sont pas enregistrées à travers le sudo, vous pouvez dire sudo(8) de préserver l'environnement en utilisant l' -Eoption, comme ceci:

sudo -E evince

Une meilleure façon: env_keep

Vous pourriez bien demander, Attendez, si -Etout fonctionne comme par magie, alors pourquoi n'est-ce pas la valeur par défaut sudo? La réponse est qu'il s'agit d'un danger potentiel pour la sécurité. Les variables d'environnement affectent le fonctionnement des programmes et vous ne voulez pas qu'elles soient toutes exportées d'un compte d'utilisateur vers la racine. La façon "correcte" de le faire est d'ajouter la ligne Defaults env_keep += "DISPLAY XAUTHORITY"au fichier sudoers(5) en utilisant visudo(8) . Vous pouvez vérifier les variables d'environnement que sudo conserve en exécutant:

sudo sudo -V

(Oui, vous tapez sudodeux fois). Je recommande de ne pas placer la ligne dans le fichier sudoers par défaut ( /etc/sudoers), mais dans un fichier local qui ne sera pas écrasé lors de la mise à niveau de votre système. Vous pouvez faire ça comme ça:

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

Mais attendez, que se passe-t-il si aucun des éléments ci-dessus ne fonctionne?

Je pense que c'est une réponse assez approfondie, mais si vous rencontrez toujours des problèmes, il y a une autre chose que je suggérerais. Vous pouvez utiliser xhost(1) pour accorder l'accès à un utilisateur spécifique sur l'hôte local (votre machine) comme ceci,

xhost si:localuser:root

Dans ce cas, nous spécifions rootcomme nom d'utilisateur, car c'est le compte qui sudoexécute les programmes en tant que.


[*] : Q: Je n'ai qu'un seul écran, alors pourquoi un écran X a-t-il besoin d'une "adresse"? R: C'est parce que X peut fonctionner non seulement sur votre machine, mais sur Internet. Avec X , il est facile d'exécuter des programmes sur votre machine qui s'affichent sur d'autres hôtes Internet et des programmes sur d'autres hôtes qui apparaissent sur votre écran (en supposant que vous leur en donnez la permission).

hackerb9
la source
Merci pour la réponse élaborée. Je suis sûr qu'il y a au moins quelque chose de nouveau dans votre réponse pour chaque utilisateur. (Pour moi: comment accorder l'accès à X à un utilisateur spécifique, ce qui est mieux que d'émettre xhost +pour autoriser l'accès universel.)
drumfire
3

XDG_RUNTIME_DIRest une variable d'environnement définie dans votre contexte X Windows, afin que les programmes puissent trouver des choses. Vous ( neo) avez configuré le contexte graphique.

En essayant de courir evincecomme root, vous avez entré dans la condition où un utilisateur ( root) tente d'accéder à un autre utilisateur ( neoaffichage). Ceci est considéré comme une mauvaise chose.

Si vous décidez que vous DEVEZ exécuter un éditeur graphique comme root, lisez man gksudo et utilisez gksudo.

waltinator
la source
commentaire intéressant. Savez-vous par hasard comment je pourrais faire quelque chose comme ça? journalctl -b -p err | wl-copyil signale Failed to connect to a Wayland serverce qui est sensé, mais sonne stupide de POV utilisateur.
mh-cbon