我正在尝试使用 shell 脚本通过网站在我的服务器(安装了 Ubuntu 服务器的旧笔记本电脑)上播放 .wav 文件。
现在的问题是,当我在 root 上通过 mplay 播放 .wav 文件时,一切都正常,但如果我尝试通过用户 www-data 播放声音,我会收到以下错误消息:
$ sudo -u www-data sh script.sh
MPlayer 1.4 (Debian), built with gcc-11 (C) 2000-2019 MPlayer Team
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing bell.wav.
libavformat version 58.76.100 (external)
Audio only file format detected.
Load subtitles in ./
==========================================================================
Opening audio decoder: [mpg123] MPEG 1.0/2.0/2.5 layers I, II, III
AUDIO: 48000 Hz, 2 ch, s16le, 40.0 kbit/2.60% (ratio: 5000->192000)
Selected audio codec: [mpg123] afm: mpg123 (MPEG 1.0/2.0/2.5 layers I, II, III)
==========================================================================
AO: [pulse] Init failed: Connection refused
Failed to initialize audio driver 'pulse'
Could not open/initialize audio device -> no sound.
Audio: no sound
Video: no video
但是使用 root 权限,它就可以正常工作:
$ sh script.sh
MPlayer 1.4 (Debian), built with gcc-11 (C) 2000-2019 MPlayer Team
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing /var/www/html/bell.wav.
libavformat version 58.76.100 (external)
Audio only file format detected.
Load subtitles in /var/www/html/
==========================================================================
Opening audio decoder: [mpg123] MPEG 1.0/2.0/2.5 layers I, II, III
AUDIO: 48000 Hz, 2 ch, s16le, 40.0 kbit/2.60% (ratio: 5000->192000)
Selected audio codec: [mpg123] afm: mpg123 (MPEG 1.0/2.0/2.5 layers I, II, III)
==========================================================================
AO: [pulse] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A: 2.8 (02.8) of 3.0 (03.0) 0.5%
shell 脚本如下所示:
$ cat script.sh
#!/bin/sh
mplayer '/var/www/html/bell.wav'
现在,在查看了无数的帖子后,我确保 www-data 具有其所需的所有权限,并将其添加到用户组中:
$ sudo -u www-data groups
www-data cdrom audio video pulse-access
我尝试单独使用 mplay$ sudo -u www-data mplayer bell.wav
来测试脚本是否存在问题,但收到了上述相同的错误消息。
我使用 查看了 dmsg sudo dmesg | grep pulse
,但似乎没有有关 pulse 的消息。我就是搞不清楚我做错了什么,我猜想这一定与 www-data 的访问权限有关,因为如果我使用完全相同的 shell 脚本并以 root 身份运行,一切都会正常。
答案1
出于安全原因,用户www-data
默认只是该组的成员。www-data
仅群组成员audio
可以播放音频。
您可以通过将www-data
用户添加到audio
组来测试,如下所示:
sudo adduser www-data audio
然后它应该能够播放音频。
虽然从组继承的权限audio
可以被认为是低安全风险的,但是您需要知道,在您的 Web 服务器下运行并由用户拥有的所有脚本www-data
也将继承这些权限...因此,您需要权衡所有安全风险与收益,并自行决定。
稍后,您可以像这样www-data
从组中删除该用户:audio
sudo deluser www-data audio
答案2
我通过在 script.sh 中播放声音之前启动 PulseAudio 守护程序解决了该问题,并且它按预期工作。
正确的脚本现在如下所示:
#!/bin/sh
pulseaudio -D
mplayer './bell.wav'