Описание:
Я хотел бы получить доступ к системной службе D-Bus с другого компьютера, зная только IP-адрес компьютера и службу, к которой нужно подключиться.
Я недавно обнаружил Габриэль (D-Bus через SSH). Я скомпилировал его версию GIT (размещенную на Sourceforge), и, похоже, это работает, но у меня все еще возникают проблемы с отсутствием «keep-alive». Это означает, что после некоторого периода бездействия туннель SSH не может пересылать запросы D-Bus на удаленный компьютер, и я должен перезапустить Габриэля.
Поскольку Габриэль использует socat на ПК, к которому он подключается, у меня только что появилась идея использовать socat и на локальном ПК (заменив им Габриэля).
Вопросы:
Любые комментарии приветствуются.
Я отправлю ответ на свой вопрос, так как я разработал рабочее решение.
Примечание: Я пожертвовал всей безопасностью через SSH, поскольку он не нужен для разработки в моей локальной сети. Также было невозможно изменить DBus для прослушивания TCP вместо сокетов unix.
Шаг 1
На удаленном хосте с примерным IP-адресом 192.168.1.100 (и к которому я бы хотел получить доступ) я запускаю:
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 и их методов. Это можно сделать с помощью пункта меню «Файл / Подключиться к другой шине» и ввода собственного абстрактного имени сокета, определенного на втором шаге.
SSH имеет встроенный сохранить механизм. Может быть, вы используете это, чтобы убедиться, что ваша сессия не закрыта?
Чтобы включить сохранение активности в ssh,
Либо добавьте следующую строку в файл / etc / ssh / ssh_config для глобальная конфигурация:
ServerAliveInterval 60
Или добавьте следующие строки в ~ / .ssh / config (создайте, если требуется) для конфигурация пользователя
Host *
ServerAliveInterval 60
Вы также можете использовать конфигурацию для каждого хоста, добавив имя хоста к *, например:
Host *hostname.com
ServerAliveInterval 60
Где 60, представляет интервал в секундах, после которого отправляется код сохранения активности / запрета операций. Также важен пробел во второй строке.