Включить выполнение FFMPEG под Apache + Django + WSGI в CentOS 7 (SELinux)

547
digofreitas

У меня есть веб-сайт, работающий под Django и Apache (httpd), и в представлении мне нужно вызвать FFMPEG для преобразования изображения в видео. Он работал на Ubuntu 12 годами, но теперь нам нужно перенести его на CentOS 7, и все стало сложнее. Код выглядит так:

ffcmd = '/usr/local/bin/ffmpeg -y -loop 1 -i %s -t %d -vf "fade=in:0:5,fade=out:%d:5" -pix_fmt yuv420p -r "30" -c:v libx264 %s %s.mp4 %s' % (##PARAMS##) import subprocess  p = subprocess.Popen(ffcmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) out, err = p.communicate() 

Но я получаю ошибку на ERR выходе:

Exception: /bin/sh: /usr/local/bin/ffmpeg: Permission denied 

После некоторого тестирования я обнаружил, что SELinux блокирует и регистрирует его. Когда я отключил SELinux, он работал, но я должен оставить его включенным из-за внутренней политики нашего клиента.

Я нашел несколько команд, которые должны прочитать заблокированные правила и отключить их, используя «audit2allow»:

grep httpd /var/log/audit/audit.log | audit2allow -m httpdlocal > httpdlocal.te 

Выше, чтобы увидеть правила в файле httpdlocal.te . Ниже их применять.

grep httpd /var/log/audit/audit.log | audit2allow -M httpdlocal semodule -i httpdlocal.pp 

Даже с этим, все еще логирование "Отказано в доступе" .

Я на правильном пути или есть лучший способ сохранить SELinux в «принудительном» режиме и разблокировать выполнение FFMPEG под Apache?

0
Вместо того, чтобы пытаться обойти правила (не зная, что они на самом деле), вы должны связаться с людьми, которые их создали, чтобы их можно было изменить или хотя бы подробно объяснить. Вы уверены, что проблема действительно в ffmpeg, а не в использовании оболочки (`shell = True`)? Или, по крайней мере, если вы используете оболочку, дайте ей разрешить путь к `ffmpeg`. xenoid 6 лет назад 1
Правила SELinux являются стандартными, наш клиент просто обязуется их использовать, но мы можем сейчас включить и отключить любое правило. Команды Python работают вне Apache, и эта "shell = True" является просто способом написать команду оболочки (строка над списком). На самом деле, я только что установил FFMPEG внутри папки веб-сайта с помощью команды SEMODULE, описанной выше, но я подожду более подходящего решения, прежде чем закрывать поток. digofreitas 6 лет назад 0

0 ответов на вопрос

Похожие вопросы