简短回答:设置 XDG_RUNTIME_DIR

简短回答:设置 XDG_RUNTIME_DIR

在我的工作中,我支持远程员工通过 SSH 和 VNC 运行 Linux Mint。

每个员工都使用 USB 耳机,这是我们希望激活的唯一声音设备。我们需要禁用的声音设备是“内置音频”设备,如果我在员工桌面上打开一个终端,我可以通过运行来检查该设备是否被禁用pacmd list-sinks | grep "Built-in Audio"

如果我使用员工的用户名和密码登录,此命令也可以通过 SSH 运行,但如果我尝试使用管理员“IT”用户名进行 SSH,则会出现错误“没有运行 PulseAudio 守护进程,或者没有作为会话守护进程运行。“帮助!为了安全起见,我没有每个员工的本地密码,但当我通过我的 IT 用户名进行 SSH 时,我似乎无法检查内置音频是否处于活动状态,即使我使用以下命令将 IT 提升到 root 权限su

我尝试使用su - [employee]命令然后访问本地显示export DISPLAY=:0,但这也不允许我检查声音设备。 :(

答案1

我想到了!事实证明该aplay --list-devices命令保存了我需要的变量。运行该命令会为我提供目标计算机上的卡,以及下次停机时的“子设备 1/1”字符串。如果设备打开,“子设备”字符串将更改为 0/1,如果设备关闭,则更改为 1/1。

从那里,我只需进行管道传输grep -A 1,以便可以解析出卡的状态(在本例中名为“模拟”),然后将输出封装在 if/then 语句中,以确定内置音频是打开还是关闭。

if aplay --list-devices|grep -A 1 Analog|grep Subdevices:\ 0/1;then echo Built-in IS ON;else echo off

答案2

简短回答:设置 XDG_RUNTIME_DIR

sudo su -l employee_login
export XDG_RUNTIME_DIR=/run/user/$(id -u)
pacmd list-sinks | grep "Built-in Audio" 

解释

诀窍是 PulseAudio 会查找${XDG_RUNTIME_DIR}对于套接字,它需要与守护进程通信。然而,XDG_RUNTIME_DIR当用户登录时由 PAM(Linux 的可插入身份验证模块)设置。当您使用sudo或 时su,您已跳过 PAM,因此该变量未设置。

第一步:成为用户

sudo su -l employee_login

su命令将您的有效 UID(用户 ID)设置为与您尝试帮助的员工相同。这是必要的,因为 PulseAudio 对此类事情很挑剔并且会拒绝工作。

-l并不是绝对必要的,但有时它有助于调试运行用户登录脚本时可能出现的问题。

如果您已经将权限提升为 root,则sudo之前无需执行此操作。su -l employee_login

步骤 2:设置 XDG_RUNTIME_DIR

export XDG_RUNTIME_DIR=/run/user/$(id -u)

环境XDG_RUNTIME_DIR是必要的,因为这是用户登录时启动的 PulseAudio 守护进程创建套接字pulse/nativepulse/cli用于与客户端通信的地方。 [脚注1]

第 3 步:使用 PulseAudio

pacmd list-sinks | grep "Built-in Audio"

pacmd工具可以让人们内省(或重新配置)正在运行的 PulseAudio 守护进程。人们可以想到 PulseAudio 的术语下沉意思是“演讲者”和来源意思是“麦克风”。

这里我们运行 PulseAudio 的list-sinks命令,其中列出了所有可用的输出设备。我们用来grep检查“内置音频”是否存在,因为在最初的问题中,员工的机器应该禁用该功能,因此不能用作可能的接收器。

请注意pacmd(以及它的表弟pactl)比这更强大,不仅可以用来诊断问题,还可以远程修复问题。例如,如果音频输出正确,但默认选择了错误的麦克风,则可以执行以下操作:

pactl set-default-source alsa_input.usb-USB_Camera_USB_Camera_SN0001-02.analog-mono 

提示:pacmdpactl最好与安装的 bash-completion 一起使用,这样就可以使用TAB两次来查看选项,一次来完成长源/接收器名称。但是,请避免使用内置的特殊命令行,pacmd因为它不使用libreadline并且没有历史记录或完成。

脚注1

从技术上讲,PulseAudio 守护进程并不总是使用XDG_RUNTIME_DIR。例如,如果在未设置该变量时启动守护进程,它将使用 /tmp 以及 ~username/.config/pulse/ 中的符号链接音频设备-运行。类似地,可以将 PulseAudio 配置为与其他用户共享套接字,或者容器之间

相关内容