描述:
我想从另一台机器访问D-Bus系统服务,只知道机器的IP地址和要连接的服务。
我最近发现的是Gabriel (通过SSH的D-Bus)。 我已经编译了它的GIT版本(在Sourceforge上托pipe),这似乎工作,但我一直得到缺乏“保持活力”的问题。 这意味着经过一段时间的不活动后,SSH隧道无法将D-Bus请求转发到远程PC,我必须重启Gabriel。
由于Gabriel在连接PC上使用socat,所以我刚刚有一个在本地PC上使用socat的想法(用Gabrielreplace它)。
问题:
任何意见赞赏。
我会发布一个自己的问题的答案,因为我已经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表示以秒为单位的时间间隔,在此之后发送保活/非保存代码。 另外,第二行的空间很重要。