34 votes

Qu'est-ce que XDG_RUNTIME_DIR ?

Pendant que j'essayais d'ouvrir Evince à partir de la ligne de commande, il 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 ?

77voto

hackerb9 Points 1716

Commençons par le commencement : 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 XDG_RUNTIME_DIR est fixé par pam_systemd (8) Il n'est donc pas réellement lié à X (exécution de programmes en mode graphique), qui est le problème que vous semblez rencontrer.

Comment résoudre les problèmes

Votre deuxième question, "Comment résoudre ce problème ?" est très bon. Cela signifie que vous êtes intéressé non seulement par ce que la solution, mais aussi comment pour le découvrir par toi-même. Pour commencer, regardez d'abord les premiers messages d'erreur. En particulier, recherchez No protocol specified o WARNING **: Could not open X display devrait vous montrer que le problème vient X (également appelé Le système de fenêtrage X ) qui est la façon dont les programmes graphiques sont affichés sur votre écran. Le fait de savoir cela devrait soulever de nombreuses questions de dépannage dans votre esprit.

X AFFICHAGE

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

echo $DISPLAY

Et vous pouvez vérifier ce que sudo pense que votre AFFICHAGE est en tapant :

sudo -s
echo $DISPLAY
exit

S'il ne montre rien, c'est qu'il y a un problème. (Voir la correction ci-dessous).

XAUTHORITY

Mais, et si ce n'était pas le problème et que le DISPLAY est réglé correctement dans sudo ? Vous pouvez alors vous demander si X a une sorte de permission qui empêche les autres utilisateurs d'écrire sur mon écran ? Si vous pensiez ça, vous auriez raison, X dispose de deux méthodes d'autorisation principales : xauth y xhost . Le plus couramment utilisé aujourd'hui est xauth (1) qui utilise le XAUTHORITY variable d'environnement. Encore une fois, vérifions si elle est correctement définie dans sudo :

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Si XAUTHORITY pointe vers un fichier dans votre répertoire personnel pour vous, mais il est vide quand vous exécutez sudo alors c'est ça le problème.

FIX : Sauvegarder les variables d'environnement

Alors, quelle est la solution ? Si l'un ou l'autre DISPLAY ou le XAUTHORITY Les variables d'environnement ne sont pas sauvegardées dans le sudo vous pouvez dire sudo (8) pour préserver l'environnement en utilisant le -E comme suit :

sudo -E evince

Une meilleure solution : env_keep

Vous pourriez vous demander, Attendez, si -E fait que tout fonctionne comme par magie, alors pourquoi n'est-ce pas la solution par défaut pour sudo ? La réponse est qu'il s'agit d'un risque 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 manière "correcte" de le faire est d'ajouter la ligne suivante Defaults env_keep += "DISPLAY XAUTHORITY" a la sudoers (5) en utilisant visudo (8) . Vous pouvez vérifier quelles variables d'environnement sudo préserve en exécutant :

sudo sudo -V

(Oui, vous tapez sudo deux fois). Je recommande de ne pas mettre 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 à jour de votre système. Vous pouvez le faire comme suit :

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

Mais attendez, et si rien de ce qui précède ne fonctionne ?

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

xhost si:localuser:root

Dans ce cas, nous spécifions root comme nom d'utilisateur, puisque c'est le compte que sudo exécute des programmes comme.


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

5voto

waltinator Points 32821

XDG_RUNTIME_DIR est une variable d'environnement définie dans votre contexte X Windows, afin que les programmes puissent trouver des choses. Vous ( neo ) ont mis en place le contexte graphique.

En essayant d'exécuter evince comme root vous avez saisi la condition dans laquelle un utilisateur ( root ) essaie d'accéder à l'ordinateur d'un autre utilisateur ( neo ). Ceci est considéré comme une mauvaise chose.

Si vous décidez que vous DEVEZ exécuter un éditeur graphique en tant que root , lire man gksudo et faire usage de gksudo .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X