如何通过 ssh 可靠地附加到会话 DBUS?

dro*_*nus 4 linux ssh dbus

我在 ssh 上使用依赖于 dbus 的工具几乎没有取得任何成功(例如pactl——pulseaudio 命令行界面——选择音频输出)。

我知道如何手动将会话的 DBUS 地址导出到DBUS_SESSION_BUS_ADDRESS,但仍然几乎所有应用程序都失败并显示connection refused at pa_context_new().

遗憾的是,这完全符合对 dbus、kdbus(和 systemd)的所有保留意见......

那么,要让依赖于 DBUS 的任何应用程序像在桌面会话中一样通过 ssh 运行,实际上需要哪些步骤?
有没有不依赖屏幕长脚本的非易碎、不易出错的方法来获取总线地址?
还需要什么 - 来自地址的 appart - 允许连接?

use*_*686 7

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-logincommon-session)。


这就是说,当你需要使用其他通过SSH程序-哪些程序依赖会话总线上-有三种常见的选项:

  • 要附加到“新”用户总线:

    一些系统/发行版可能已经转向“用户总线”模型,其中每个 UID 只有一个而不是一定数量的会话总线。它的地址是unix:path=/run/user/$UID/bus用 dbus-daemon,或者kernel:path=/sys/fs/kdbus/$UID-user/bus用 kdbus。

    如果 $DBUS_SESSION_BUS_ADDRESS 和 $DISPLAY 都没有设置,最新版本的 sd-bus、libdbus、gdbus 会自动尝试这个地址。这使得“用户总线”模型成为您第一个问题的最可靠答案,因为您只需要知道您自己的 UID。(大多数涉及传统“会话总线”模型的方法都不可靠,因为可能有任意数量的那些,不完全是一个......)

  • 要连接到“传统”会话总线:

    会话总线地址通常是随机选取的,以避免冲突。但是,出于各种目的(主要是为了“总线自动启动”功能),地址存储在~/.dbus/session-bus/$MACHINE_ID-$DISPLAY(大约)中。

    所以你可以像以前一样手动设置$DBUS_SESSION_BUS_ADDRESS,但你也可以设置$DISPLAY,程序会根据X11显示找到匹配的会话总线。

  • 要启动新的(专用)会话总线:

    dbus-launch --exit-with-session /bin/bash
    
    Run Code Online (Sandbox Code Playgroud)