我在 ssh 上使用依赖于 dbus 的工具几乎没有取得任何成功(例如pactl
——pulseaudio 命令行界面——选择音频输出)。
我知道如何手动将会话的 DBUS 地址导出到DBUS_SESSION_BUS_ADDRESS
,但仍然几乎所有应用程序都失败并显示connection refused at pa_context_new()
.
遗憾的是,这完全符合对 dbus、kdbus(和 systemd)的所有保留意见......
那么,要让依赖于 DBUS 的任何应用程序像在桌面会话中一样通过 ssh 运行,实际上需要哪些步骤?
有没有不依赖屏幕长脚本的非易碎、不易出错的方法来获取总线地址?
还需要什么 - 来自地址的 appart - 允许连接?
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。
如果 $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) 归档时间: |
|
查看次数: |
5304 次 |
最近记录: |