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

Описание:

Я хотел бы получить доступ к системному сервису D-Bus с другого компьютера, зная только IP-адрес компьютера и сервис для подключения.

То, что я недавно нашел, это Габриэль (D-Bus через SSH). Я скомпилировал его версию GIT (размещенную на Sourceforge), и это, кажется, работает, но у меня продолжает возникать проблема с отсутствием "keep-alive". Это означает, что после некоторого периода бездействия SSH-туннель не может пересылать запросы D-Bus на удаленный ПК, и я должен перезапустить Габриэля.

Так как Габриэль использует socat на ПК, к которому он подключается, у меня только что была идея использовать socat также на локальном ПК (заменив Габриэля этим).

Вопросы:

  • Может кто-нибудь, более знакомый с настройкой "socat", подтвердить это решение, пожалуйста?
  • Может ли такое решение одновременно обрабатывать множество клиентских приложений, подключающихся к одной и той же удаленной службе D-Bus?
  • Поскольку для меня нет необходимости иметь защищенное соединение - будет ли использование "socat" с обеих сторон значительно ускорить соединение (в отличие от туннеля Габриэля SSH, если SSH дает слишком много служебной информации)?
  • У кого-нибудь есть лучшее решение для удаленного доступа к D-Bus?

Любые комментарии приветствуются.

2 ответа

Решение

Я отправлю ответ на свой вопрос, так как я разработал рабочее решение.

Примечание: я пожертвовал всей безопасностью через SSH, так как она не требовалась для разработки в моей локальной сети. Изменение 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 и их методов. Это можно сделать с помощью пункта меню "Файл / Подключиться к другой шине" и указав свое собственное абстрактное имя сокета, определенное на втором этапе.

SSH имеет встроенный механизм поддержки активности. Может быть, вы используете это, чтобы убедиться, что ваша сессия не закрыта?

Чтобы включить сохранить в SSH,

Либо добавьте следующую строку в файл /etc/ssh/ssh_config для глобальной конфигурации:

ServerAliveInterval 60

Или добавьте следующие строки в ~/.ssh/config (создайте при необходимости) для пользовательской конфигурации

Host *
 ServerAliveInterval 60

Вы также можете использовать конфигурацию для каждого хоста, добавив имя хоста к *, например:

Host *hostname.com
 ServerAliveInterval 60

Где 60, представляет интервал в секундах, после которого отправляется код подтверждения активности / отсутствия активности. Также важно место во второй строке.

Другие вопросы по тегам