Pourquoi ne puis-je pas exécuter les applications de l'interface graphique à partir de 'root': “Aucun protocole spécifié”?

39

J'ai installé Debian sur ma machine hier soir. À présent, je ne comprends pas pourquoi je ne peux pas exécuter d’applications graphiques à partir d’un terminal sous root.

Par exemple:

sudo -i
glxgears

Génère la sortie suivante:

No protocol specified
Error: couldn't open display :0

Mais lorsque j'ouvre le terminal pour la première fois, je peux exécuter glxgearsle compte d'utilisateur. Ce n'est qu'après que je fais sudo -ique le problème se pose. Cela se produit pour n'importe quelle application graphique que j'essaie de lancer. Je pense que c'est probablement lié à X11, mais je ne suis pas sûr.

Poulpe
la source
1
stackoverflow.com/a/20612084 cela a parfaitement fonctionné pour moi.

Réponses:

39

L'accès au serveur X nécessite deux choses:

  • La $DISPLAYvariable pointant vers le bon affichage (généralement :0)
  • Informations d'authentification appropriées

Les informations d'authentification peuvent être explicitement spécifiées via $XAUTHORITY, et par défaut, ~/.Xauthoritysinon.

Si $DISPLAYet $XAUTHORITYest défini pour votre utilisateur, sudoles définira également pour le nouveau shell et tout devrait fonctionner correctement.

S'ils ne sont pas définis, ils utiliseront probablement les mauvaises valeurs par défaut et vous ne pourrez pas démarrer et les applications X.

Dans Debian $XAUTHORITYn’est généralement pas défini explicitement. Ajoutez simplement

export XAUTHORITY=~/.Xauthority

à votre .bashrcou explicitement dire XAUTHORITY=~/.Xauthority sudo ...et tout devrait fonctionner.

Vous pouvez également utiliser xauth listpour vérifier si les informations d'authentification appropriées sont disponibles.

michas
la source
1
xauth infoindique le chemin d'accès au fichier d'autorité
Tomas Tomecek
1
xhost +résolu mon problème
danger89
3
Sachez que l’ xhost +authentification est complètement désactivée et permet à tout le monde d’accéder à toutes les applications de votre écran ...
michas
1
pour debian, est-ce que je tape l'export XAUTHORITY en tant que root? parce que ça ne marche pas sur deb10? Je me connecte avec sudo su
marinara
@marinara utilise sudo -iau lieu de sudo su -.
Michas
24

J'ai eu la même question que vous mais pour un utilisateur normal. Disons que je veux démarrer Firefox en utilisant le compte utilisateur foo. Je suis connecté en tant que bar:

[bar@localhost ~]$ sudo -u foo -H firefox

Malheureusement, cette commande a échoué avec la même erreur que dans la question (c.-à-d. Aucun protocole spécifié et impossible d'ouvrir l'affichage)

Ma solution consistait simplement à ajouter l'utilisateur foo à la liste des accès autorisés au serveur X.

xhost si:localuser:foo

Et c’est tout, j’ai alors pu lancer Firefox (et une autre application X) en utilisant sudoet l’utilisateur foo.

Contexte : Sous X Window, il existe une architecture client / serveur. Lorsque vous lancez une application, vous demandez l'autorisation au serveur X de l'afficher. Par défaut, une fois que vous avez ouvert une session (vous vous connectez graphiquement), vous (votre utilisateur) êtes évidemment autorisé à communiquer avec le serveur et à afficher les applications. Les autres utilisateurs ne disposent pas de cette autorisation, sauf si vous le spécifiez. xhostest un outil pour manipuler la liste des permissions. Le sisymbole indique que la règle est côté serveur et autorise l'utilisateur local fooà afficher des applications. X Window est très puissant à cet égard et vous pouvez afficher des applications distantes localement en jouant avec la DISPLAYvariable d'environnement et xhost(sans toutefois s'y limiter). Dans les temps anciens, quand les gens tapaientxhost + et autorisait implicitement tout le monde à utiliser leur session X, il était possible d'afficher des applications sur leur écran pour les blagues ;-) pas tellement aujourd'hui que les gens utilisent de moins en moins l'architecture client / serveur X Window (du moins pour ce que j'observe 10 dernières années).

PS: Je l’ai fait pour lancer Firefox dans une sorte de "prison" (pour éviter une vulnérabilité comme celle de pdf.js à l’avenir). Mais j’ai vite compris qu’appeler Firefox via sudo ne lui permettrait pas d’accéder à l’audio ni au matériel vidéo. Mais il y a un gars qui explique clairement comment activer l'accélération matérielle vidéo et l'audio lors de l'appel de Firefox via sudo . YMMV avec ces instructions, par exemple, je dispose toujours d’une autorisation refusée pour l’audio mais la vidéo fonctionne (testée sur Fedora 22 avec SELinux ON).

Huygens
la source
1
Dans mon cas fooétait root, à savoir que je devais courir xhost si:localuser:rootsur Ubuntu 17.10.
Karl Richter
Où ajoutez-vous la xhost si:localhost<user>commande? Si aucun utilisateur n'est connecté, personne n'a de serveur X disponible pour donner l'autorisation.
cbcoutinho
@cbcoutinho Le cas d'utilisation ci-dessus concerne le cas où une personne est connectée et veut exécuter une application XWindow en tant que personne sur le même hôte. Si vous expliquez votre cas d'utilisation (quel est le problème que vous souhaitez résoudre), je peux potentiellement vous aider.
Huygens
@Huygens J'ai un poste de travail pour la simulation de fluides qui est également équipé d'un GPU. Je rend les visualisations avec ParaView, un programme construit sur vtk, généralement sur le poste de travail lui-même. ParaViewfournit également un modèle de rendu client / serveur sans tête sécurisé via ssh, que je souhaiterais utiliser à distance au lieu d’utiliser VNC. Sans xhostme connecter au poste de travail et sans m'exécuter , je ne peux pas utiliser le GPU. Cela signifie que je ne peux pas redémarrer l'ordinateur à distance et que j'ai toujours accès au GPU.
cbcoutinho
1
@cbcoutinho X Window est une architecture client / serveur. Lorsque vous vous connectez via ssh, votre poste de travail local devient le client X Window. Vous pouvez utiliser xhost avec des protocoles non sécurisés comme rlogin mais pas ssh. Vous devez demander à ssh de le faire pour vous. Utilisez soit le drapeau -Xou (mieux?) -YSur ssh, il fera la redirection appropriée. Bien sûr, vous avez besoin d’un serveur C local. Cependant, avec GPU et OpenGL, je ne sais pas trop où se situe le calcul / rendu, c’est peut-être du côté client, pas du côté serveur. Pourrait être délicat.
Huygens
10

Vous pouvez soit

Spécifiez l'affichage à utiliser sur la ligne de commande, en ajoutant -display :0.0

ou

Configurez la variable d'environnement dans le script de connexion de root (un des fichiers .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Vous pouvez vérifier si c'est réglé,

$ env |grep DISPLAY
DISPLAY=:0.0

Pour ouvrir votre affichage à tous les utilisateurs de tous les hôtes en tant qu'utilisateur normal, vous pouvez le faire avec:

xhost +

X Tian
la source
1
xhost + travaille temporairement avant d'entrer dans le sudo
Octopus
1
xhost +travaillé pour moi aussi, seulement qu'ils ont oublié de mentionner que nous devrions l'exécuter à partir du terminal de l'utilisateur qui autorise, pas d'un terminal sous sudo su.
Nyxee
1
travail parfait comme boom
Adiii
3

Étant donné que vous êtes sur Debian, la solution simple et supportée consiste sudoà copier vos informations d’autorisation X11. pam_xauthest inclus dans le libpam-modulespackage à cette fin; pour l'utiliser, il vous suffit d'ajouter

session  optional  pam_xauth.so

à votre /etc/pam.d/sudodossier. Vous pouvez également choisir de l'ajouter suégalement. Pour des informations complètes, consultez pam_xauthbien sûr la page de manuel.

Toby Speight
la source
2

Ce qui m'a aidé:

  1. Vous pouvez xauth generate :0 . trustedsur le usercôté, ce qui va générer une nouvelleMIT-MAGIC-COOKIE-1
  2. Vérifiez la clé nouvellement créée avec la variable xauth list' asutilisateur androot (they should be the same if yourxAuthority` qui pointe vers le même fichier.

  3. Voila, accédera rootà tout X-Appdepuis le terminal, mais seulement temporairement.

Pour le rendre permanent, voir la réponse de @Huygens!

Timo
la source
1

Solution alternative :

Les services tels que cron qui s'exécute sous root n'ont pas accès à l'affichage si l'utilisateur x actuel n'est pas root.

Nous avons juste besoin d'ajouter l'utilisateur root à x, vous pouvez le faire au moment de la connexion avec un script de démarrage

xhost local:root

À des fins de test, nous pouvons simplement exécuter la commande sous l'utilisateur actuel et relancer le script racine / job / service / ...

intika
la source
Juste curieux, pourquoi voudriez-vous lancer une application graphique via un cron?
Octopus
dans ma distribution, j'ai un travail root (msec) qui vérifie la santé de la sécurité du système et crée un rapport ... donc, au lieu d'aller dans les journaux pour vérifier ce rapport, je préfère avoir un gui contextuel avec le rapport lorsque ce travail est exécuté
Intika
CECI a fonctionné pour moi
Marcus Vinicius Pompeu
0

La sudocommande a un commutateur pour préserver les variables d'environnement.

 -E, --preserve-env            preserve user environment when running command

Pour que vous puissiez exécuter la commande avec l'option -E. Exemple:

sudo -E wireshark

Si vous n'avez pas besoin d'exécuter des applications critiques pour la confidentialité telles que les navigateurs Web, il est préférable d'ajouter l'option -E avec sudo. Nous ne pouvons pas exécuter Chrome ou Firefox simplement en ajoutant le commutateur -E . Parce que de nombreux navigateurs ont mis en place une protection contre les violations de l'espace utilisateur. La réponse de @ huygens peut donner un aperçu de ce sujet.

Remarque: Ajout d' option -e ne l' aide si l'environnement de votre utilisateur n'a pas DISPLAY et XAUTHORITY déjà correctement réglé .

shan
la source
-1

utilisez cette commande et cela fonctionnera

sudo cp /home/user/.Xauthority .Xauthority
utilisateur187508
la source
2
Cela donnera cp: cannot stat ‘/home/user/.Xauthority’: No such file or directorysur l’une des 10 machines basées sur Debian auxquelles j’ai accès.
Anthon
Cela donne un peu de contexte (par exemple, vous attendez silencieusement un répertoire en cours) et vous ne mentionnez pas les effets secondaires tels que des problèmes lorsque vous le faites dans plusieurs instances X11. Je pense que cette façon est un peu hacky.
v6ak