web-dev-qa-db-fra.com

En tant que root, je peux utiliser su pour apporter des modifications à dconf pour un autre utilisateur. Comment puis-je les faire appliquer?

Le scénario ci-dessous suppose que nous avons démarré l'ordinateur et que nous nous sommes connectés sous le nom d'utilisateur bort dans le menu de connexion. C'est le 14.04.2.

Si j'ouvre un terminal, en tant qu'utilisateur bort, je peux lister un paramètre dconf, par exemple

$ dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode
0

Si je devais utiliser dconf write pour modifier la valeur à 1, le menu situé à gauche de l'écran serait masqué

$ dconf write /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode 1
$ dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode
1

Maintenant le menu est caché. Supposons maintenant que j'utilise dconf write pour le remettre à 0. Le menu réapparaîtra.

Maintenant, si j'étais dans un terminal en tant qu'utilisateur root et que j'essayais d'utiliser su bort -c pour changer la valeur de bort, je peux le changer. Je le sais car dans un autre terminal où je suis l'utilisateur bort, je peux utiliser dconf read et voir que la valeur a été remplacée par 1. Ainsi, la valeur a été modifiée MAIS le menu situé à gauche de l'écran est toujours visible. Comment puis-je appliquer les modifications au lieu d'être simplement mises à jour dans la base de données dconf? En fin de compte, je veux savoir ceci pour une utilisation avec le type exec de Puppet, mais pouvoir le faire en tant que racine depuis le terminal serait utile pour atteindre cet objectif.

En tant que root dans un terminal:

# su bort -c "/bin/sh -c '/usr/bin/dconf write /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode 1'"

Comme bort dans un terminal après l'exécution de la commande précédente:

$ dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode
1

Pourtant, le menu est toujours là. Je sais que ce type de question a des réponses sur ce site, telles que l’utilisation de dbus-launch mais cela n’a pas fonctionné pour moi. Peut-être qu'il s'agit d'une version spécifique d'Ubuntu?

5
Bort

La variable d'environnement DBUS_SESSION_BUS_ADDRESS n'est pas définie, les modifications ne sont donc pas conservées. En tant qu’utilisateur, notez la sortie de

echo $DBUS_SESSION_BUS_ADDRESS

puis dans la commande root utiliser

export DBUS_SESSION_BUS_ADDRESS=xxxxx && dconf write ...

qui devrait fonctionner.

Après avoir combattu leur tentative pour cacher un peu leur socket, une solution efficace pour obtenir automatiquement l'adresse consiste à l'emprunter via un environnement de processus:

# requires a GUI session program that will always run:
p=`pgrep -u \`whoami\` gnome-panel`

r=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$p/environ | sed 's/^[^=]*=//'`
export DBUS_SESSION_BUS_ADDRESS=$r

Bien sûr, vous devrez choisir autre chose que gnome-panel si vous ne l'exécutez pas.

Fonctionne également pour SSH_AUTH_SOCK. Laisser simplement ceci ici pour aider les gens qui ont jusqu'ici cherché sur Google sans succès (comme moi;)).

3
Donjan Rodic