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.
L'accès au serveur X nécessite deux choses:
$DISPLAY
variable pointant vers l'affichage correct (généralement :0
)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.
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).
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 +
É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.
Ce qui m'a aidé:
xauth generate :0 . trusted
Du côté user
, ce qui générera un nouveau MIT-MAGIC-COOKIE-1
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.
Voila, root
accédera à tout X-App
Depuis le terminal, mais seulement temporairement.
Pour le rendre permanent, voir la réponse de @Huygens!
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/...
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 .