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?
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.
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.
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).
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.
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
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
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
.