访问其他用户的D-Bus会话

时间:2011-06-27 17:50:48

标签: unix dbus

让我们假设这种情况:我们有一个用户登录,通过sudosu执行某个应用程序。此用户已运行dbus-daemon 但是,当以root权限运行的应用程序尝试访问D-Bus时,它只会生成root用户拥有的另一个dbus-daemon。这不是一个理想的情况。

有没有办法获得通过sudosu运行应用程序的用户的D-Bus会话?

2 个答案:

答案 0 :(得分:5)

首先,在使用DBUS_SESSION_BUS_ADDRESSsu调用应用程序时,需要保留sudo个环境变量。不幸的是,这还不够,因为DBus总是检查(作为安全措施)调用进程的UID和会话守护进程是否相同。唯一的解决方法是在连接到会话总线之前从此应用程序中调用seteuid。您可以使用seteuid(0)重新获得权限。

答案 1 :(得分:2)

如果您使用的是systemd发行版,则relatively new machinectl shell命令可以执行su / sudo的工作,并且还会设置会话变量例如XDG_RUNTIME_DIRDBUS_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一起破解某些内容。