Qu’est-ce que XDG_RUNTIME_DIR?

Pendant que j’essayais d’ouvrir Evince depuis la ligne de commande, cela me donnait 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?

Tout d’abord: XDG_RUNTIME_DIR

Pour répondre à votre première question, “Qu’est-ce que XDG_RUNTIME_DIR?” , c’est une variable d’environnement définie automatiquement lorsque vous vous connectez. Elle indique à n’importe quel 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 défini par pam_systemd (8) , il n’est donc pas lié à X (exécution graphique des programmes), ce qui semble être le problème que vous rencontrez.

Comment dépanner

Votre deuxième question, “Comment résoudre ce problème?” est un très bon. Cela signifie que vous êtes intéressé non seulement à savoir quelle est la solution, mais également à vous débrouiller seul. Pour commencer, regardez les premiers messages d’erreur en premier. En particulier, la recherche de No protocol specified ou WARNING **: Could not open X display , devrait vous indiquer que le problème provient de X (également appelé Système de fenêtrage X ), qui correspond à l’affichage des programmes graphiques sur votre écran. Sachant cela devrait soulever de nombreuses questions de dépannage dans votre esprit.

X AFFICHAGE

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

 echo $DISPLAY 

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

 sudo -s echo $DISPLAY exit 

Si cela ne montre rien, alors c’est le problème. (Voir le correctif ci-dessous).

XAUTHORITÉ

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

 echo $XAUTHORITY sudo -s echo $XAUTHORITY exit 

Si XAUTHORITY pointe vers un fichier de votre répertoire personnel, 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 les variables d’environnement DISPLAY ou XAUTHORITY ne sont pas enregistrées dans sudo , vous pouvez indiquer à sudo (8) de préserver l’environnement à l’aide de l’option -E , comme suit:

 sudo -E evince 

Une meilleure façon: env_keep

Vous pourriez bien demander, attendez, si -E fait que tout fonctionne comme par magie, alors pourquoi n’est-ce pas la valeur par défaut pour sudo ? La réponse est que c’est un risque potentiel pour la sécurité. Les variables d’environnement affectent le fonctionnement des programmes et vous ne souhaitez pas qu’ils soient tous exportés d’un compte utilisateur vers la racine. La méthode “correcte” consiste à append la ligne Defaults env_keep += "DISPLAY XAUTHORITY" au sudoers (5) à l’aide de visudo (8) . Vous pouvez vérifier quelles variables d’environnement sont préservées par sudo en exécutant:

 sudo sudo -V 

(Oui, vous tapez sudo deux 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, et si rien de ce qui précède ne fonctionne?

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

 xhost si:localuser:root 

Dans ce cas, nous spécifions root tant que nom d’utilisateur, car c’est le compte sous lequel sudo exécute les programmes.


[*] : Q: Je n’ai qu’un seul écran, alors pourquoi un affichage X a-t-il besoin d’une “adresse”? R: C’est parce que X peut travailler non seulement sur votre machine, mais également sur Internet. Avec X , il est facile d’exécuter sur votre ordinateur des programmes qui apparaissent 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 donniez la permission).

XDG_RUNTIME_DIR est une variable d’environnement définie dans votre contexte X Windows, afin que les programmes puissent rechercher des éléments. Vous ( neo ) avez configuré le contexte graphique.

En essayant d’exécuter evince tant que root , vous avez entré la condition dans laquelle un utilisateur ( root ) tente d’accéder à l’affichage 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 , lisez man gksudo et utilisez gksudo .