Как надежно подключить к сеансу DBUS через ssh?

3096
dronus

У меня вряд ли был какой-либо успех с использованием dbus-зависимого инструмента через ssh (например, pactlинтерфейс командной строки pulseaudio, который выбирает вывод звука).

Я знаю, как вручную экспортировать адрес DBUS сеанса в DBUS_SESSION_BUS_ADDRESS, но все равно почти любое приложение терпит неудачу с такими сообщениями, как connection refused at pa_context_new().

К сожалению, это хорошо подходит для всех оговорок в отношении dbus, kdbus (и systemd) ...

Итак, какие шаги на самом деле требуются, чтобы любое приложение, зависящее от DBUS, работало с ssh так же, как это было бы из сеанса рабочего стола?
Есть ли какой-нибудь неброский, не подверженный ошибкам способ получить адрес шины, не полагаясь на скрипты на весь экран?
Что еще требуется - приложение с адреса - чтобы разрешить подключение?

4
Может быть, я смешиваю что-то вместе ... Как работают некоторые приложения dbus, например. `d-фут`` просмотрщик dbus, я полагаю, что он больше связан с импульсными аудиоразъемами, помимо его подключения к dbus. dronus 8 лет назад 0
С другой стороны, pulseaudio использует dbus и должен также найти и аутентифицировать свой собственный сокет, если правильный dbus доступен. dronus 8 лет назад 0

1 ответ на вопрос

5
grawity

pactl не зависит от D-Bus - это всего лишь один из различных методов, которые он может использовать для поиска управляющего сокета. Который теперь всегда находится в том же месте - $XDG_RUNTIME_DIR/pulse/native(как в pulseaudio v3.0). Так что первоначальная жалоба просто не имеет смысла. Я уверен, что strace -e connect pactl infoэто покажет, что ошибка «Отказано в соединении» происходит из-за попытки подключиться к самому pulseaudio, а не к D-Bus.

  • Одна из возможных причин: если strace показывает, что pactl пытается использовать /var/run/pulse/nativeвместо пути для пользователя, $ XDG_RUNTIME_DIR может быть не установлен. Вы можете установить его вручную (на /run/user/$UID), однако, было бы лучше выяснить, почему он не устанавливается автоматически.

    Переменная $ XDG_RUNTIME_DIR устанавливается pam_systemd.so; убедитесь, что ваш /etc/pam.d/sshdконфигурационный файл в конечном итоге перечисляет этот модуль (иногда напрямую, но чаще, путем включения подконфигурации, такой как system-loginили common-session).


Тем не менее, когда вам нужно использовать другие программы через SSH - программу, которые делают зависеть от сеанса шины - есть три общих варианта:

  • Чтобы подключиться к «новой» шине пользователя:

    Некоторые системы / дистрибутивы, возможно, уже перешли на модель «пользовательской шины», где вместо некоторого количества сессионных шин существует только одна для каждого UID. Его адрес - unix:path=/run/user/$UID/busс помощью dbus-daemon или kernel:path=/sys/fs/kdbus/$UID-user/busс помощью kdbus.

    Последние версии sd-bus, libdbus, gdbus будут автоматически пытаться использовать этот адрес, если не установлены ни $ DBUS_SESSION_BUS_ADDRESS, ни $ DISPLAY. Это делает модель «пользовательской шины» наиболее надежным ответом на ваш первый вопрос, так как все, что вам нужно знать, это ваш собственный UID. (Большинство подходов, использующих традиционную модель "сессионной шины", не могут быть надежными, поскольку их может быть любое количество, а не один ...)

  • Чтобы подключиться к «традиционной» сессионной шине:

    Адрес шины сеанса обычно выбирается случайным образом, чтобы избежать конфликтов. Однако для различных целей (в первую очередь для функции «автозапуск шины») адрес сохраняется в ~/.dbus/session-bus/$MACHINE_ID-$DISPLAY(прибл.).

    Таким образом, вы можете вручную установить $ DBUS_SESSION_BUS_ADDRESS, как и раньше, но вместо этого вы также можете установить $ DISPLAY, и программа найдет подходящую шину сеанса на основе дисплея X11.

  • Чтобы начать новый (выделенный) сеанс шины:

    dbus-launch --exit-with-session /bin/bash 

Похожие вопросы