[size=120]“Pour rappel, il est fortement déconseillé de lancer une application graphique en tant qu’utilisateur root cela pouvant entraîner des répercutions négatives sur votre système.” Edit de l’équipe du forum[/size]
Voir le fil de discussion à ce sujet, et notamment l’excellente explication de fran.b.
J’avais l’habitude sous KDE3 de souvent utiliser sux au lieu de su pour passer en console root, afin de pouvoir lancer des applications graphiques pendant mes bricolages (l’exemple le plus commun étant mon éditeur favori kate pour éditer des fichiers système).
Mais avec mon install toute fraîche de KDE4, j’ai été assez surpris de ne plus pouvoir lancer d’applications KDE à partir d’une console root sans obtenir systématiquement une vilaine erreur DBus.
En cherchant un peu sur internet, j’ai trouvé qu’il fallait préfixer toute commande KDE par « dbus-launch », par exemple :
dbus-launch kate /etc/apt/preferences
Ça marche, mais on peut pas dire que ça soit super pratique…
De plus, cette méthode a un énorme souci : à chaque fois, un nouveau dbus-daemon est lancé qui reste en mémoire jusqu’au reboot de la machine à moins d’être killé à la main !
Ma « solution » originale à ce problème était de rajouter un eval $(dbus-launch) au fichier /root/.bashrc, mais le même problème se posait : chaque nouvelle session root lançait un nouveau dbus-daemon persistant.
Après avoir fouillé un peu partout (et notamment dans man dbus-launch, on ne répétera jamais assez que man est notre ami) j’ai finalement réussi à comprendre le pourquoi du comment.
Le problème est que lors d’un su ou sux « simples » (su - et sux - ne sont pas affectés) les variables d’environnement sont recopiées, y compris la variable DBUS_SESSION_BUS_ADDRESS qui pointe alors vers le serveur DBus de l’utilisateur (et qui refuse les connexions de tout autre utilisateur y compris root).
Partant de là, il ne reste plus qu’à exploiter la fonctionnalité « --autolaunch » de DBus : lorsque la variable DBUS_SESSION_BUS_ADDRESS est vide, DBus se débrouille comme un grand pour retrouver une précédente instance du démon, ou bien pour le lancer s’il n’existe pas encore.
En conséquence, si vous avez l’habitude d’utiliser su ou sux sans mettre de « - » après, il suffit de faire la manipulation suivante pour effacer automatiquement la variable au démarrage d’une session root :
# echo 'DBUS_SESSION_BUS_ADDRESS=' >> /root/.bashrc
On déconnecte/reconnecte la session root (avec sux pour faire le lien avec X) et tout fonctionne comme on est en droit d’attendre.
Résultat : un seul serveur DBus pour root, toutes les applications root peuvent communiquer entre elles sans pour autant pouvoir accéder aux DBus des utilisateurs. Et bien entendu, plus de vilain message d’erreur.
Voilà voilà, j’espère que ça pourra éviter à quelqu’un d’autre de perdre du temps à chercher comment résoudre ce souci !