描述:
我想从另一台机器访问 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 表示发送保持活动/无操作代码的间隔(以秒为单位)。此外,第二行中的空格也很重要。