让我们假设这种情况:我们有一个用户登录,通过sudo
或执行一些应用程序su
.这个用户已经dbus-daemon
运行了.
但是,当以root权限运行的应用程序尝试访问D-Bus时,它只会生成另一个dbus-daemon
由root用户拥有的应用程序.这不是一个理想的情况.
有没有办法获得通过sudo
或运行应用程序的用户的D-Bus会话su
?
如果您使用的是 systemd 发行版,则相对较新的 machinectl shell
命令可以完成su
/的工作sudo
,并且还会设置会话变量,例如XDG_RUNTIME_DIR
和DBUS_SESSION_BUS_ADDRESS
。因此,例如,如果我想以systemctl --user
user身份运行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
来一起破解某些东西。
首先,DBUS_SESSION_BUS_ADDRESS
在使用su
或调用应用程序时,需要保留环境变量sudo
.不幸的是,这还不够,因为DBus总是检查(作为安全措施)调用进程的UID和会话守护进程是否相同.唯一的解决方法是seteuid
在连接到会话总线之前从此应用程序调用.你可以重新获得你的特权seteuid(0)
.