Сценарий Python запускается с помощью команды shell_exec
, но ничего не выводит.
Под отсутствием вывода я подразумеваю отсутствие ошибок, и при направлении вывода в файл файл создается, но остается пустым.
Что работает:
sudo -u apache ...
shell_exec
запускаются как apacheshell_exec
в том же сценарии PHP, который выводится в ту же папку.Единственное различие между скриптами, которые работают, и скриптами, которые не работают, - это использование import
для загрузки модулей.
ОБНОВЛЕНИЕ: похоже, что это проблема с разрешениями, но я не могу понять, почему
/usr/local/bin/python2.7: can't open file '/var/www/scripts/script.py': [Errno 13] Permission denied
Расположение скрипта: /var/www/scripts
/var
drwxrwxr-x. 20 root apache 4096 Oct 26 00:04 var
/var/www
drwxrwxr-x. 8 root apache 4096 Oct 13 13:55 www
/var/www/scripts
drwxrwxrwx. 2 apache apache 4096 Oct 27 01:26 scripts
/var/www/scripts/script.py
-rwxrwxrwx. 1 apache apache 1315 Oct 27 09:25 script.py
ОБНОВЛЕНИЕ: F ***** g SELinux.
Временное отключение SELinux с помощью setenforce Permissive
решает проблему. Как лучше всего сделать так, чтобы SELinux позволял Apache постоянно запускать этот скрипт из этого каталога?
@mario - все отчеты об ошибках включены, и в журналах ничего нет. Пытался добавить эти флаги, но тоже ничего не получил.
«Единственная разница между скриптами, которые работают, и скриптами, которые не работают, - это использование import
для загрузки модулей». Тогда разве вы не должны показывать нам эту часть кода? Я не знаю, как мы можем помочь, не видя этого. Пожалуйста, прочтите Как спросить.
Эти флаги ничего не сделают, если вы не последуете совету в справочнике (а не только первому ответу!)
@Chris, импорт не является чем-то особенным (я не думаю). он просто импортирует time
urllib2
и sys
@Chris: Я указываю версию Python в shell_exec
, используя /usr/local/lib/python2.7
, поэтому сомневаюсь в этом. И, как я уже упоминал в сообщении, когда сценарий запускается с использованием sudo -u apache
в оболочке, все работает нормально. Это не работает только при вызове через PHP-скрипт в браузере.
@Chris обновил мой вопрос с проблемами с разрешениями. Есть предположения?
Вообще-то да, может быть. Какую ОС вы используете? SELinux, AppArmor или аналогичные могут мешать этому работать.
CentOS 6. Думал, что отключил SELinux ..
SELinux выглядит виноватым. Временное отключение с помощью setenforce Permissive
решает проблему. Какое лучшее постоянное решение, позволяющее SELinux разрешить apache запускать этот скрипт из этого каталога?
Это сложный вопрос, поскольку он полностью зависит от ваших целей. Постоянное отключение SELinux, безусловно, сработает, но тогда вы потеряете другие его средства защиты. Я бы не рекомендовал это, но, поскольку вы думали, что уже отключили его, возможно, это нормально. Вы также можете создать политику SELinux, чтобы Apache мог запускать этот сценарий. Как это сделать, выходит за рамки того, что мы можем здесь рассказать, но в Интернете есть учебные пособия.
См. Также Как я могу отладить проблемы с exec ()? и
python -v -v -d