Как запустить mplayer из PHP exec() www-data

У меня есть домашний сервер с графическим интерфейсом для воспроизведения интернет-радио с помощью mplayer. Но когда я воспроизвел его с сервера, он не воспроизводился, и в журнале ошибок Apache говорилось, что доступ запрещен к домашнему каталогу.

Я также использую exec(pkill mplayer) для остановки службы перед созданием новой.

Итак, в настоящее время мне нужно добавить www-данные в /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 &");

person Casper    schedule 25.12.2015    source источник


Ответы (3)


Если вы хотите, чтобы звук исходил от сервера:

Запустите 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&");
person Anonymous    schedule 22.02.2017

Я предполагаю, что когда вы пытаетесь запустить что-то из вашего /home, у www-data, вероятно, нет прав для этого местоположения.

Насчет безопасности я не уверен, но вы даете пользователям www-data право запускать mplayer от имени root. Поэтому mplayer становится уязвимым для эксплуатации.

возможно, вы можете выделить права на один скрипт для запуска mplayer для них. Затем дайте этому сценарию только права на выполнение, чтобы его нельзя было так просто отредактировать.

person TMpic    schedule 25.04.2016

Я пытался сделать это с видео, но я просто не мог получить права на отображение 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-данных в вашу группу и удаление chmod должно вероятно сработать. Например, вы можете захотеть ограничить воспроизведение файлов локальными файлами с помощью test -f $PLAYPATH, но я хочу, чтобы там можно было использовать URL-адреса http.

person Ken_g6    schedule 04.08.2018