使用 socat 远程访问 D-Bus

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)。

问题:

  • 任何更熟悉设置“socat”的人都可以确认该解决方案吗?
  • 这样的解决方案能否同时处理连接到同一个远程 D-Bus 服务的多个客户端应用程序?
  • 因为我没有必要确保连接安全 - 在双方使用“socat”是否会使连接速度明显加快(与 Gabriel 的 SSH 隧道相反,如果 SSH 提供太多开销)?
  • 有没有人有更好的远程访问 D-Bus 的解决方案?

任何意见表示赞赏。

sch*_*dar 8

我将发布我自己问题的答案,因为我已经找到了一个可行的解决方案。

注意:我已经通过 SSH 牺牲了所有安全性,因为在我自己的 LAN 中进行开发不需要它。更改 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
Run Code Online (Sandbox Code Playgroud)

现在 socat 侦听 7272 端口上的连接并为每个客户端创建一个单独的线程。这允许同时进行多个连接。

第2步

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

   socat ABSTRACT-LISTEN:/tmp/custom_dbus_name,fork TCP:192.168.1.100:7272
Run Code Online (Sandbox Code Playgroud)

这将连接到使用 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 服务及其方法。这可以通过“文件/连接到其他总线”菜单选项并在第二步中定义自定义抽象套接字名称来完成。