我有一个带GUI的家庭服务器,可以使用mplayer
播放互联网广播。但当我在服务器上播放它时,它不会播放,apache错误日志显示拒绝访问主目录。
在创建新服务之前,我还使用exec(pkill mplayer)
来停止服务。
因此,目前我不得不将www数据添加到/etc/sudoer中,并具有ALL访问权限,这很有效。我试着去[回家],但它也不会开始。
所以我想知道在没有安全风险的情况下,从Web服务器启动mplayer
的最佳方法是什么。
这是我的代码
exec("pkill mplayer");
exec("mplayer -slave -quiet http://iedm-fl.akacast.akamaistream.net/7/293/156397/v1/auth.akacast.akamaistream.net/iedm-fl </dev/null >/dev/null 2>&1 &");
如果你想让声音从服务器出来:
运行sudo adduser www-data audio
并重新启动服务器。这将授予用户www-data
制作音频的权限。之后,您的原始代码应该可以工作了。如果没有,可以尝试更简单的方法:
exec("pkill mplayer");
exec("mplayer http://iedm-fl.akacast.akamaistream.net/7/293/156397/v1/auth.akacast.akamaistream.net/iedm-fl&");
我想当你试图从你的/home www数据运行一些东西时,可能没有这个位置的权限。
关于安全性,我不太确定,但你给了www数据用户以root身份运行mplayer的权限。因此,mplayer变得容易受到剥削。
也许您可以隔离单个脚本的权限,以便为它们运行mplayer。然后只给这个脚本执行权限,这样它就不会这么容易编辑了。
我一直在尝试用视频来实现这一点,但我无法获得在屏幕上显示mplayer的权限。因此,我创建了一个BASH脚本来等待inotifywait
的文件更改,然后作为有权使用它的用户运行mplayer
#!/bin/bash
# Mplayer server
# Watches for a file to be populated; then launches mplayer
PLAYFILE=/tmp/mserver_play.txt
CONTROL=/tmp/mserver_control
if [ -f $PLAYFILE ] ; then rm -f $PLAYFILE ; fi
while true ; do
touch $PLAYFILE
chmod a+w $PLAYFILE
r="$(inotifywait $PLAYFILE 2> /dev/null)"
if [ "$(echo $r | tail -1 | cut -d' ' -f2)" != "MODIFY" ] ; then
echo File removed or changed, exiting
exit 1
fi
# The wait is over! Play the file.
PLAYPATH="$(head -1 $PLAYFILE)"
rm $PLAYFILE
# TODO: Put in security checks on PLAYPATH.
if [[ -p $CONTROL ]]; then
rm -f $CONTROL
fi
mkfifo $CONTROL
chmod a+w $CONTROL
mplayer -autosync 30 -mc 2 -cache 10240 -cache-min 50 -ao sdl -lavdopts skiploopfilter=all -vf cropdetect -quiet -slave -input file=$CONTROL "$PLAYPATH" 2> /dev/null > /dev/null
done
以具有运行mplayer权限的用户身份运行该脚本。mplayer在这里的标签可能比我们任何一个目的所需的都多,但它适用于视频和音频。然后在PHP中,您只需将要播放的路径写入$PLAYFILE,例如使用file_put_contents('/tmp/mserver_play.txt', $the_file_to_play)
。
当然,安全是相对的。任何用户都可以写入文件来启动mplayer,但我找不到一种简单的方法来限制它;但是将www数据添加到您的组中并删除chmods应该可能有效。例如,您可能希望使用test -f $PLAYPATH
将文件限制为本地文件播放,但我希望能够在那里使用http URL。