web-dev-qa-db-fra.com

Pourquoi ne puis-je pas exécuter les applications GUI à partir de 'root': "Aucun protocole spécifié"?

J'ai installé Debian sur ma machine hier soir. Maintenant, je ne comprends pas pourquoi je ne peux pas exécuter d'applications GUI à partir d'un terminal lors de l'exécution en tant que 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 glxgears à partir du compte utilisateur. C'est seulement après que je le fasse Sudo -i que le problème surgit. Cela se produit pour toute application graphique que j'essaie d'exécuter. Je pense que son probablement lié à X11, mais je ne suis pas sûr.

41
Octopus

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

  • Le $DISPLAY variable pointant vers l'affichage correct (généralement :0)
  • Informations d'authentification appropriées

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

Si $DISPLAY et $XAUTHORITY est défini pour votre utilisateur, Sudo les définira également pour le nouveau shell, et tout devrait fonctionner correctement.

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

Dans Debian $XAUTHORITY n'est généralement pas défini explicitement. Ajoutez simplement

export XAUTHORITY=~/.Xauthority

à ton .bashrc ou dites explicitement XAUTHORITY=~/.Xauthority Sudo ... et tout devrait fonctionner.

Vous pouvez aussi utiliser xauth list pour vérifier si les informations d'authentification appropriées sont disponibles.

40
michas

J'avais la même question que toi 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'est-à-dire aucun protocole spécifié et ne peut pas ouvrir l'affichage)

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

xhost si:localuser:foo

Et c'était tout, j'ai ensuite pu lancer Firefox (et d'autres applications X) en utilisant Sudo et l'utilisateur foo.

Contexte: Sur X Window, il existe une architecture client/serveur. Lorsque vous lancez une application, vous demandez l'autorisation du serveur X pour l'afficher. Par défaut, une fois que vous ouvrez une session (vous vous connectez graphiquement), vous (votre utilisateur) êtes évidemment autorisé à communiquer avec le serveur et à afficher les applications. Les autres utilisateurs n'ont pas cette autorisation sauf si vous la spécifiez. xhost est un outil pour manipuler la liste des permissions. si indique que la règle est côté serveur et autorise l'utilisateur local foo à afficher les applications. X Window est très puissant à cet égard et vous pouvez afficher des applications distantes localement en jouant avec la variable d'environnement DISPLAY et xhost (mais sans s'y limiter). Autrefois, lorsque les gens tapaient xhost + et permettait implicitement à tout le monde d'utiliser leur session X, il était possible d'afficher une application sur leur écran pour des farces ;-) pas tellement de nos jours que les gens utilisent de moins en moins l'architecture client/serveur X Window (du moins pour ce que j'observe) au cours des 10 dernières années).

PS: je l'ai fait pour lancer Firefox dans une sorte de "prison" (pour éviter une vulnérabilité comme pour pdf.js à l'avenir). Mais j'ai rapidement découvert 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 ex. J'ai toujours une autorisation refusée avec l'audio mais la vidéo est très bien (testé sur Fedora 22 avec SELinux ON).

25
Huygens

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 (l'un parmi .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Vous pouvez vérifier si elle est définie,

$ env |grep DISPLAY
DISPLAY=:0.0

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

xhost +

10
X Tian

Étant donné que vous êtes sur Debian, la solution simple et prise en charge consiste à faire en sorte que Sudo copie vos informations d'identification d'autorisation X11. pam_xauth est inclus dans le libpam-modules package exactement à cette fin; pour l'utiliser, il suffit d'ajouter

session  optional  pam_xauth.so

à ton /etc/pam.d/Sudo fichier. Vous pouvez également choisir de l'ajouter à su également. Pour plus d'informations, consultez le pam_xauth la page de manuel, bien sûr.

3
Toby Speight

Ce qui m'a aidé:

  1. Vous pouvez xauth generate :0 . trusted Du côté user, ce qui générera un nouveau MIT-MAGIC-COOKIE-1
  2. Vérifiez la clé nouvellement créée avec la variable utilisateur xauth list' as Racine and(they should be the same if your XAuthority` qui pointe vers le même fichier.

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

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

2
Timo

Solution alternative:

Des services comme cron fonctionnant 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 than sous l'utilisateur actuel et relancer le script racine/job/service/...

1
intika

La commande Sudo possède un commutateur pour conserver les variables d'environnement.

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

Pour que vous puissiez exécuter la commande avec le commutateur -E. Exemple:

Sudo -E wireshark

Si vous n'avez pas besoin d'exécuter des applications critiques pour la confidentialité comme les navigateurs Web, vous feriez mieux d'ajouter le commutateur -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 . @ huygens's answer peut avoir des idées sur ce sujet.

Remarque: L'ajout du commutateur -E n'aidera pas si l'environnement de votre utilisateur n'a PAS DISPLAY et XAUTHORITY déjà défini correctement .

0
shan