访问另一个用户的 D-Bus 会话

Posted

技术标签:

【中文标题】访问另一个用户的 D-Bus 会话【英文标题】:Access another user's D-Bus session 【发布时间】:2011-09-23 17:18:48 【问题描述】:

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

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

【问题讨论】:

如果您从持有会话的用户到 root 执行su -,它应该可以工作,另一个方向将不起作用,那是不想要的,而且会很大安全风险。 确实,dbus-monitor --system 在这种情况下对您没有帮助吗? 【参考方案1】:

如果您使用的是 systemd 发行版,relatively newmachinectl shell 命令可以完成su/sudo 的工作,它还将设置会话变量,如XDG_RUNTIME_DIRDBUS_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】:

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

【讨论】:

抱歉这么晚才接受你的回答,我已经放假了。我什至不需要DBUS_SESSION_BUS_ADDRESSseteuid 就足够了(至少我能够在调用用户的上下文中与 Zeitgeist 交谈)。谢谢! 但是如果情况是这样:我们有2个用户同时登录(A,B)是否可以从A连接到B的例如会话管理器?

以上是关于访问另一个用户的 D-Bus 会话的主要内容,如果未能解决你的问题,请参考以下文章

从另一个线程访问用户会话对象,如何实现?

有没有办法撤销另一个用户的访问令牌并结束他们在 Identity Server 4 中的会话?

http协议。会话控制cookie

Iphone IOS,从另一个音频会话访问音频数据

我们可以通过 D-bus 访问数据成员和指向对象的指针吗?

由于 2 个会话同时访问相同的存储过程,导致事务(进程 ID)死锁