来自另一个用户的DBus


DBus from another user

我正试图从PHP程序连接到DBus。

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

我尝试过用system调用qdbus,也尝试过用Python-dbus调用Python脚本,但这两种方法都不起作用。此外,我无法编译这个PHP扩展,但我认为它不会解决我的问题。

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

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

(这对我不起作用。)

首先,您有要调用的dbus方法吗?Dbus只是一个传输层,您需要一个承载Dbus方法的程序和一个调用dbu方法的程序。我假设您有一个想要从php程序调用的dbus方法。

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

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

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

一些解决方案是:

  1. 以用户身份运行apache
  2. 在系统总线上运行dbus,公开这些方法,并允许apache从dbus配置文件中调用它们。这需要root访问权限,这可能会使问题复杂化
  3. 研究向其他用户公开会话dbus方法是否有效。最好应该有一个可以使用的dbusphp库。我非常确信,只要apache可以调用dbus方法,那么在dbus-config文件夹中有一个xml文件来公开它就可以了