使用 socat 远程访问 D-Bus

使用 socat 远程访问 D-Bus

描述:

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

我最近发现的是加布里埃尔(通过 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 解决方案吗?

欢迎提出任何评论。

答案1

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

笔记:我牺牲了所有通过 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

现在 socat 监听 7272 端口上的连接,并为每个客户端创建一个单独的线程。这样可以同时建立多个连接。

第2步

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

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

D-脚

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

答案2

SSH 已内置保活机制。您是否使用它来确保您的会话没有关闭?

要在 ssh 中启用保持活动,

将以下行添加到 /etc/ssh/ssh_config 文件中全局配置

ServerAliveInterval 60

或者将以下几行添加到 ~/.ssh/config 中(如果需要,可以创建)用户配置

Host *
 ServerAliveInterval 60

您还可以通过将主机名附加到 * 来使用每个主机配置,例如:

Host *hostname.com
 ServerAliveInterval 60

其中 60 表示发送保持活动/无操作代码的间隔(以秒为单位)。此外,第二行中的空格也很重要。

相关内容