使用socat远程访问D-Bus

描述:

我想从另一台机器访问D-Bus系统服务,只知道机器的IP地址和要连接的服务。

我最近发现的是Gabriel (通过SSH的D-Bus)。 我已经编译了它的GIT版本(在Sourceforge上托pipe),这似乎工作,但我一直得到缺乏“保持活力”的问题。 这意味着经过一段时间的不活动后,SSH隧道无法将D-Bus请求转发到远程PC,我必须重启Gabriel。

由于Gabriel在连接PC上使用socat,所以我刚刚有一个在本地PC上使用socat的想法(用Gabrielreplace它)。

问题:

  • 任何人更熟悉build立“socat”确认解决scheme吗?
  • 这样的解决scheme能否处理许多客户端应用程序同时连接到相同的远程D-Bus服务?
  • 因为我不需要保证连接 – 双方都使用“socat”会使连接快得多(与Gabriel的SSH隧道相反,如果SSH提供了太多的开销)?
  • 有没有人有更好的解决scheme远程访问D-Bus也许?

任何意见赞赏。

我会发布一个自己的问题的答案,因为我已经find了一个工作的解决scheme。

注意:我已经牺牲了所有的安全性,因为在我自己的局域网中不需要开发。 改变DBUS侦听TCP代替unix套接字也是不可能的。


步骤1

在具有示例IP地址192.168.1.100的远程主机(以及我想要访问的D-Bus)上运行:

socat TCP-LISTEN:7272,reuseaddr,fork UNIX-CONNECT:/var/run/dbus/system_bus_socket 

现在,socat在7272端口上监听连接,并为每个客户端创build一个单独的线程。 这允许在同一时间多个连接。

第2步

在本地机器上(我想连接到远程D-Bus)运行:

  socat ABSTRACT-LISTEN:/tmp/custom_dbus_name,fork TCP:192.168.1.100:7272 

这连接到与socat远程暴露的端口,并创build一个我们可以连接到的本地抽象套接字。


示例用法

python:

 import dbus sysbus = dbus.bus.BusConnection("unix:abstract=/tmp/custom_dbus_name") proxy_obj = sysbus.get_object('com.some.service.name', '/com/some/service/name') my_interface = dbus.Interface(proxy_obj, dbus_interface = 'com.some.interface.name') my_interface.SomeDBusExposedMethod() my_interface.OtherRemoteMethod() 

d-脚

也可以使用D-Feet来浏览远程D-Bus服务及其方法。 它可以通过“文件/连接到其他总线”菜单选项并将您自定义的抽象套接字名称在第二步中定义完成。

SSH有内置的保活机制 。 可能是你使用,以确保你的会议没有closures?

要在ssh中保持活着状态,

将以下行添加到/ etc / ssh / ssh_config文件以进行全局configuration

 ServerAliveInterval 60 

或者将以下行添加到〜/ .ssh / config(如果需要,则创build)用于用户configuration

 Host * ServerAliveInterval 60 

您也可以通过将主机名添加到*来使用每个主机configuration,例如:

 Host *hostname.com ServerAliveInterval 60 

60表示以秒为单位的时间间隔,在此之后发送保活/非保存代码。 另外,第二行的空间很重要。