如何从PHP exec()www数据运行mplayer


How to run mplayer from PHP exec() www-data

我有一个带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。