作为 root,我可以使用 su 为其他用户更改 dconf。我如何才能真正应用它们?

作为 root,我可以使用 su 为其他用户更改 dconf。我如何才能真正应用它们?

以下场景假设我们启动了计算机,并在登录菜单中以用户 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-sessionman dbus-launch

我认为,这应该可以在 Ubuntu 上运行(未测试

相关内容