访问另一个用户的 D-Bus 会话
Posted
技术标签:
【中文标题】访问另一个用户的 D-Bus 会话【英文标题】:Access another user's D-Bus session 【发布时间】:2011-09-23 17:18:48 【问题描述】:让我们假设这种情况:我们有一个用户登录,通过sudo
或su
执行某个应用程序。此用户有一个 dbus-daemon
正在运行。
但是,当以 root 权限运行的应用程序尝试访问 D-Bus 时,它只会生成另一个由 root 用户拥有的 dbus-daemon
。这不是我们想要的情况。
有没有办法访问通过sudo
或su
运行应用程序的用户的 D-Bus 会话?
【问题讨论】:
如果您从持有会话的用户到 root 执行su -
,它应该可以工作,另一个方向将不起作用,那是不想要的,而且会很大安全风险。
确实,dbus-monitor --system
在这种情况下对您没有帮助吗?
【参考方案1】:
如果您使用的是 systemd 发行版,relatively newmachinectl shell
命令可以完成su
/sudo
的工作,它还将设置会话变量,如XDG_RUNTIME_DIR
和DBUS_SESSION_BUS_ADDRESS
。所以举个例子,如果我想以用户test
的身份运行systemctl --user
,正常的方法会失败:
$ 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
一起破解一些东西。
【讨论】:
machinectl
现在似乎消失了。我正在进行debian测试。我认为它被遗弃了。
它在 ArchLinux 上。这确实对我有用,但我在 Lua 脚本中尝试它并失败了:(。
*buntu 19.10 在包 systemd-container
中包含一个 /bin/machinectl
,它接受以下语法:machinectl shell otheruserlogin@ /full/path/to/command --arguments
并成功到达该用户的 DBUS。【参考方案2】:
首先,您需要在使用su
或sudo
调用应用程序时保留DBUS_SESSION_BUS_ADDRESS
环境变量。不幸的是,这还不够,因为 DBus 总是检查(作为一种安全措施)调用进程和会话守护进程的 UID 是否相同。唯一的解决方法是在连接到会话总线之前从此应用程序调用seteuid
。然后您可以通过seteuid(0)
重新获得您的权限。
【讨论】:
抱歉这么晚才接受你的回答,我已经放假了。我什至不需要DBUS_SESSION_BUS_ADDRESS
,seteuid
就足够了(至少我能够在调用用户的上下文中与 Zeitgeist 交谈)。谢谢!
但是如果情况是这样:我们有2个用户同时登录(A,B)是否可以从A连接到B的例如会话管理器?以上是关于访问另一个用户的 D-Bus 会话的主要内容,如果未能解决你的问题,请参考以下文章