我有一个带有一些GUI的家庭服务器,可以使用mplayer
播放网络电台。但是,当我从服务器播放它时,它将无法播放,并且apache错误日志表示拒绝访问主目录。
在创建新服务之前,我还使用exec(pkill mplayer)
来停止服务。
所以目前我必须将www-data添加到具有ALL访问权限的/ etc / sudoer,并且它有效。我试图做/ home /但它也不会开始。
所以我想知道在没有安全风险的情况下从网络服务器启动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 &");
答案 0 :(得分: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&");
答案 1 :(得分:0)
我想当你尝试从你的/ home运行某些东西时,www-data可能没有这个位置的权利。
关于安全性我不太确定,但是你给了www-data用户以root身份运行mplayer的权利。因此,mplayer容易受到攻击。
也许您可以将权限隔离到单个脚本以便为它们运行mplayer。比给这个脚本只执行权限所以不能这么简单。
答案 2 :(得分:0)
我一直在尝试对视频执行此操作,但是我只是无法获得在屏幕上显示mplayer的权限。因此,我使用inotifywait
在wait for a file change上创建了BASH脚本,然后以具有使用权限的用户身份运行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中,您只想write the path进入$ PLAYFILE,例如与file_put_contents('/tmp/mserver_play.txt', $the_file_to_play)
。
安全当然是相对的。任何用户都可以写入文件以启动mplayer,但我找不到限制它的简便方法。但是将www-data添加到您的组并删除chmod应该可能可行。例如,您可能希望将文件限制为使用test -f $PLAYPATH
播放到本地文件,但是我希望能够在此处使用http URL。