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

Dr *_*Kay 5 unix dbus

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

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

Jac*_*nor 7

如果您使用的是 systemd 发行版,则相对较新的 machinectl shell命令可以完成su/的工作sudo,并且还会设置会话变量,例如XDG_RUNTIME_DIRDBUS_SESSION_BUS_ADDRESS。因此,例如,如果我想以systemctl --useruser身份运行test,则正常方法将失败:

$ sudo --user=test systemctl --user
Failed to connect to bus: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但这种方式有效:

$ sudo machinectl shell --uid=test .host -- /usr/bin/systemctl --user
Run Code Online (Sandbox Code Playgroud)

如果您需要“返回”到调用 sudo 脚本的用户会话中,您可以使用SUDO_USER/SUDO_UID来一起破解某些东西。


rkh*_*rov 5

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