sch*_*dar 8 linux ssh redirection socat dbus
描述:
我想从另一台机器访问 D-Bus 系统服务,只知道机器的 IP 地址和要连接的服务。
我最近发现的是Gabriel(通过 SSH 的 D-Bus)。我已经编译了它的 GIT 版本(托管在 Sourceforge 上),这似乎有效,但我一直遇到缺乏“保持活动”的问题。这意味着在一段时间不活动后,SSH 隧道无法将 D-Bus 请求转发到远程 PC,我必须重新启动 Gabriel。
由于 Gabriel 在它连接的 PC 上使用 socat,我刚刚有了在本地 PC 上也使用 socat 的想法(用它代替 Gabriel)。
问题:
任何意见表示赞赏。
我将发布我自己问题的答案,因为我已经找到了一个可行的解决方案。
注意:我已经通过 SSH 牺牲了所有安全性,因为在我自己的 LAN 中进行开发不需要它。更改 DBus 以侦听 TCP 而不是 unix 套接字也是不可能的。
第1步
在具有示例 IP 地址 192.168.1.100(以及我想要访问的 D-Bus)的远程主机上,我运行:
Run Code Online (Sandbox Code Playgroud)socat TCP-LISTEN:7272,reuseaddr,fork UNIX-CONNECT:/var/run/dbus/system_bus_socket
现在 socat 侦听 7272 端口上的连接并为每个客户端创建一个单独的线程。这允许同时进行多个连接。
第2步
在本地机器(我想连接到远程 D-Bus)上,我运行:
Run Code Online (Sandbox Code Playgroud)socat ABSTRACT-LISTEN:/tmp/custom_dbus_name,fork TCP:192.168.1.100:7272
这将连接到使用 socat 远程公开的端口,并创建一个我们可以连接到的本地抽象套接字。
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()
Run Code Online (Sandbox Code Playgroud)
D-脚
还可以使用 D-Feet 浏览远程 D-Bus 服务及其方法。这可以通过“文件/连接到其他总线”菜单选项并在第二步中定义自定义抽象套接字名称来完成。