如何从PHP exec()www-data运行mplayer

时间:2015-12-25 04:31:00

标签: php apache sudo mplayer

我有一个带有一些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 &");

3 个答案:

答案 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的权限。因此,我使用inotifywaitwait 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。