为什么通过 SSH 使用 sudo 时缺少 pulseaudio 设备?

为什么通过 SSH 使用 sudo 时缺少 pulseaudio 设备?

我正在尝试通过 SSH 在我的 Raspberry Pi 上运行音频可视化 Python 脚本。该脚本使用 pyaudio 作为麦克风输入,据我所知,它在后台使用 pulseaudio。该脚本还使用 Adafruit 库来控制一些 NeoPixel LED,这必须以 root 身份运行

我了解到默认情况下 pulseaudio 不以 root 身份运行,而必须以用户身份运行。我通过创建一个简单的 python 脚本 (throughput.py) 来列出 pyaudio 设备来验证这一点。当我运行没有sudo 我看到 3 个设备,包括脉冲

pi@raspberrypi:~/audio-reactive-led-strip/python $ python3 throughput.py

Input Device id  1  -  Antlion USB adapter: Audio (hw:1,0)
Input Device id  2  -  pulse
Input Device id  6  -  default

但是,当我以 sudo 身份运行它时,我只看到一个设备和脉冲不见了:

pi@raspberrypi:~/audio-reactive-led-strip/python $ sudo python3 throughput.py

Input Device id  1  -  Antlion USB adapter: Audio (hw:1,0)

虽然显然不推荐,但我修改了/etc/systemd/system/pulseaudio.service以下内容这个帖子以便将 pulseaudio 服务作为系统服务运行。(我不清楚这是否与以 root 身份运行它相同。):

[Unit]
Description=Pulseaudio sound server
After=avahi-daemon.service network.target

[Service]
ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disallow-module-loading
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

有了这个,以 sudo 身份运行时,所有 3 个设备都会列出(包括 pulse),我就可以运行我的可视化脚本了在 pi 上本地

但是,如果我通过 SSH 进入 pi 并运行完全相同的命令(作为 sudo),它找不到 pulseaudio 设备 - 与我在修改之前在本地执行的操作相同pulseaudio.service。我猜想本地 sudo 和通过 SSH 的权限略有不同,但我对 linux 还不是很熟悉,并没有找到任何可以表明这是真的或如何解决它的东西。

我不知道这是否相关,但我正在使用 VS Code Remote-SSH 内部的终端来处理 SSH 部分。

更新 1

根据以下答案,我尝试使用带有 X11 转发的 Putty。但是,运行时出现以下错误start-pulseaudio-x11

pi@raspberrypi:~/audio-reactive-led-strip/python $ start-pulseaudio-x11
PuTTY X11 proxy: unable to connect to forwarded X server: Network error: Connection refused
xcb_connection_has_error() returned true
Failure: Module initialization failed
PuTTY X11 proxy: Unsupported authorisation protocol
xcb_connection_has_error() returned true
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

有人知道如何解决这个问题吗?

更新2

将文件.Xauthority从复制/home/pi/root 参见此帖sudo python3 throughput.py,当我在启用 X11 转发的情况下从 Putty运行时,我能够成功看到所有 3 个适配器,并且西明跑步!

但是,这个文件似乎.Xauthority只适用于一个 SSH 会话。我思考我每次都可以使用sudoPutty 复制它,但我还没有尝试过。我必须阅读.Xauthority文件的工作原理,以了解发生了什么,并且非常感谢大家的任何见解!

答案1

我使用 Adafruit 库控制 NeoPixel LED 和使用 pulseaudio 用 python 录制音频数据时遇到了完全相同的问题。一切正常本地,但在尝试运行脚本时输出以下错误代码通过 SSH

XDG_RUNTIME_DIR (/run/user/1000) is not owned by us
(uid 0), but by uid 1000! (This could e g happen if
you try to connect to a non-root PulseAudio as a
root user, over the native protocol. Don't do that.)

在搜索过程中,我偶然发现了以下命令

start-pulseaudio-x11

这解决了我的问题(我已经在 RasPi 和我的 PuTTY SSH 会话上激活了 X11 转发以显示文件对话框)。

答案2

正确的方法可能是找出 LED 的设备节点并授予setfacl用户操作它的权限。

相关内容