以下场景假设我们启动了计算机,并在登录菜单中以用户 bort 身份登录。这是在 14.04.2 上。
如果我以用户 bort 的身份打开一个终端,我可以列出 dconf 设置,例如
$ dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode
0
如果我使用 dconf write 将值更改为 1,屏幕左侧的菜单将被隐藏
$ dconf write /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode 1
$ dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode
1
现在菜单被隐藏了。现在假设我使用 dconf write 将其设置回 0。菜单将再次出现。
现在,如果我以 root 用户身份在一个终端中尝试使用 su bort -c 来更改 bort 的值,我可以更改它。我知道这一点是因为在另一个我是 bort 用户的终端中,我可以使用 dconf read 并看到该值已更改为 1。因此,值已更改,但屏幕左侧的菜单仍然可见。我怎样才能使更改真正应用,而不是仅在 dconf 数据库中更新?最终,我想知道这是否可用于 Puppet 的 exec 类型,但能够以 root 身份从终端执行此操作将有助于实现这一目标。
以 root 身份在终端中:
# su bort -c "/bin/sh -c '/usr/bin/dconf write /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode 1'"
运行上一个命令后,在终端中以 bort 形式运行:
$ dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode
1
但菜单仍然在那里。我知道这类问题在这个网站上有一些答案,比如使用 dbus-launch,但这对我来说不起作用。也许是 Ubuntu 版本特有的?
答案1
您没有设置 DBUS_SESSION_BUS_ADDRESS 环境变量,因此更改不会生效。作为您的用户,记下
echo $DBUS_SESSION_BUS_ADDRESS
然后在 root 命令中使用
export DBUS_SESSION_BUS_ADDRESS=xxxxx && dconf write ...
这应该可以工作。
在与他们隐藏套接字的蹩脚尝试斗争了一段时间后,一个自动获取地址的有效解决方案是通过进程环境借用它:
# 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
当然,如果您没有运行 gnome-panel,您就必须选择其他程序。
也适用于 SSH_AUTH_SOCK。我把这个留在这里,这样也许可以帮助那些到目前为止在 Google 上搜索失败的人(比如我 ;) )。
答案2
在 CentOS 8.3 上,执行以下操作来更新dconf
设置。
$user
是如上述问题标题所述的另一位用户。
dbus-run-session
是在命令行模式下启动dbus
会话的推荐方法。无需导出任何DBUS_SESSION
变量(如BUS_ADDRESS
或 PID)。
# start a new dbus session and execute the dconf command in bash shell
sudo -i -u ${user} bash <<-EOF
exec dbus-run-session -- bash -c 'dconf write /org/gnome/software/download-updates false'
EOF
要了解更多信息,请阅读手册页:man dbus-run-session
和man dbus-launch
我认为,这应该可以在 Ubuntu 上运行(未测试)