У меня есть домашний сервер с некоторым графическим интерфейсом для воспроизведения интернет-радио с помощью mplayer
, Но когда я воспроизводил его с сервера, он не воспроизводился, и в журнале ошибок apache указывалось, что доступ к домашнему каталогу запрещен.
Я также использую exec(pkill mplayer)
остановить службу перед созданием новой.
Поэтому в настоящее время я должен добавить www-данные в / etc / sudoer с ВСЕМ доступом, и это сработало. Я пытался сделать / домой /, но он тоже не запустится.
Поэтому я хочу знать, как лучше начать 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-data, вероятно, не имеет прав для этого местоположения.
Что касается безопасности, я не уверен, но вы предоставляете пользователям www-data права на запуск mplayer от имени пользователя root. Поэтому 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 там.