来自另一个用户的 DBus

Posted

技术标签:

【中文标题】来自另一个用户的 DBus【英文标题】:DBus from another user 【发布时间】:2012-08-20 20:38:35 【问题描述】:

我正在尝试从 php 程序连接到 DBus。

当我从命令行运行程序时,它可以工作,但是当它由 Apache 网络服务器(以用户 apache 运行)运行时,它无法连接到总线。

我尝试使用system 调用qdbus 和使用python-dbus 调用Python 脚本,但是这两种方法都不起作用。另外,我无法编译this PHP extension,但我认为它不会解决我的问题。

我认为问题在于提供会话总线的 DBus 守护程序以我的用户身份运行(系统总线一以messagebus 运行),但 PHP 以apache 运行。

如何连接到其他用户的总线?

(This 不适合我。)

【问题讨论】:

您使用的是什么操作系统/发行版? 我正在运行 PCLinuxOS(基于 Mandriva) 【参考方案1】:

首先,您是否有尝试调用的 dbus 方法? Dbus 仅仅是传输层,你需要一个承载 dbus 方法的程序和一个调用 dbus 方法的程序。我假设你有一个你想从你的 php 程序中调用的 dbus 方法。

apache 是如何尝试调用您的 dbus 方法的?如果您使用 php 中的 system() 方法或类似方法来调用 qdbus,则会失败。 PHP 由 apache 运行,apache 没有像您的用户那样的自动登录 dbus 进程,也没有 X11 访问权限。这意味着为了让您的 apache 拥有 dbus,您必须使用:

eval 'dbus-launch --auto-syntax' [command]

使用 PHP 的 system() 时。但这并不是最佳选择。

一些解决方案是:

    以您的用户身份运行 apache。 在系统总线上运行 dbus 并公开方法并允许 apache 从 dbus 配置文件中调用它们。这需要 root 访问权限,这会使事情复杂化。 研究将会话 dbus 方法公开给其他用户是否可行。最好有一个可以使用的 dbus-php 库。我很确定只要 apache 可以调用 dbus 方法,在 dbus 配置文件夹中有一个 xml 文件暴露它应该可以工作。

【讨论】:

以上是关于来自另一个用户的 DBus的主要内容,如果未能解决你的问题,请参考以下文章

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

将密码安全地传递给另一个程序(单独的 shell/dbus)

在 Gnome 中,dbus-monitor 上的啥信号表明用户正在注销?

通过 python 和 dbus 启动用户 systemd 服务

等待来自另一个类的 JApplet 中的用户输入

算法在两个表之间验证来自用户的数据,然后插入另一个表