Назад | Перейти на главную страницу

Доступ к D-Bus удаленно с помощью socat

Описание:

Я хотел бы получить доступ к системной службе 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, представляет интервал в секундах, после которого отправляется код сохранения активности / запрета операций. Также важен пробел во второй строке.