让我们假设这种情况:我们有一个用户登录,通过sudo
或su
执行某个应用程序。此用户已运行dbus-daemon
但是,当以root权限运行的应用程序尝试访问D-Bus时,它只会生成root用户拥有的另一个dbus-daemon
。这不是一个理想的情况。
有没有办法获得通过sudo
或su
运行应用程序的用户的D-Bus会话?
答案 0 :(得分:5)
首先,在使用DBUS_SESSION_BUS_ADDRESS
或su
调用应用程序时,需要保留sudo
个环境变量。不幸的是,这还不够,因为DBus总是检查(作为安全措施)调用进程的UID和会话守护进程是否相同。唯一的解决方法是在连接到会话总线之前从此应用程序中调用seteuid
。您可以使用seteuid(0)
重新获得权限。
答案 1 :(得分:2)
如果您使用的是systemd发行版,则relatively new machinectl shell
命令可以执行su
/ sudo
的工作,并且还会设置会话变量例如XDG_RUNTIME_DIR
和DBUS_SESSION_BUS_ADDRESS
。例如,如果我想以用户systemctl --user
运行test
,则正常方法将失败:
$ sudo --user=test systemctl --user
Failed to connect to bus: No such file or directory
但这种方式有效:
$ sudo machinectl shell --uid=test .host -- /usr/bin/systemctl --user
如果您需要"回到"在调用sudo脚本的用户会话中,您可以使用SUDO_USER
/ SUDO_UID
一起破解某些内容。