【问题标题】:How to run mplayer from PHP exec() www-data如何从 PHP exec() www-data 运行 mplayer
【发布时间】:2015-12-25 04:31:00
【问题描述】:

我有一个带有一些 GUI 的家庭服务器,可以使用 mplayer 播放互联网广播。但是当我从服务器播放它时,它不会播放,并且 apache 错误日志显示拒绝访问主目录。

我还使用exec(pkill mplayer) 在创建新服务之前停止服务。

所以目前我必须将 www-data 添加到具有所有访问权限的 /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 &");

【问题讨论】:

    标签: php apache sudo mplayer


    【解决方案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&");
    

    【讨论】:

      【解决方案2】:

      我猜当您尝试从您的 /home www-data 运行某些内容时,可能没有此位置的权限。

      关于安全性我不太确定,但您授予 www-data 用户以 root 身份运行 mplayer 的权限。因此 mplayer 变得容易被利用。

      也许您可以隔离单个脚本的权限,以便为它们运行 mplayer。比只给这个脚本执行权限,所以它不能那么容易编辑。

      【讨论】:

        【解决方案3】:

        我一直在尝试对视频执行此操作,但我无法获得在屏幕上显示 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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-15
          • 2015-02-23
          相关资源
          最近更新 更多