почему php команда `exec (" перезапуск службы apache2 ");` не работает в Ubuntu? - PullRequest
5 голосов
/ 20 ноября 2011

Мне нужно выполнить некоторые команды на моем веб-сервере с php, настроенным с помощью apache.

exec("service apache2 restart", $output);
print_r($output);

output:

Array (
    [0] =>  * Restarting web server apache2
    [1] => Action 'start' failed.
    [2] => The Apache error log may have more information.
    [3] =>    ...fail! 
)

Я предполагаю, что это из-за разрешенийphp на мою убунту!Что вы предлагаете?

Ответы [ 3 ]

6 голосов
/ 20 ноября 2011

Вам нужно запустить:

visudo

проверьте, что у вас есть строка типа

Host_Alias LOCAL=192.168.0.1 

с вашим собственным локальным IP-адресом вверху файла, затем добавьте строку

www-data       LOCAL=NOPASSWD:/usr/bin/service

И последнее в вашем PHP-файле:

exec("/usr/bin/sudo /usr/bin/service apache2 restart");

(Вы пытаетесь перезапустить apache через Интернет, может быть, вы не знаете, webmin интерфейс? Я думаю, что есть лучшие решения, чем этот способ sudo. Неправильно разрешать www-data останавливать , запустите (...) все службы. Лучше объясните, почему вы хотите перезапустить apache;))

2 голосов
/ 20 ноября 2011

Службы (в смысле системных служб, таких как Apache httpd) могут управляться (запускаться, останавливаться, перезапускаться) только пользователем root (UID 0).

Либо вы запускаете скрипт PHP в контексте root ( плохо идея), либо используете что-то вроде sudo для запуска команд от имени суперпользователя. Тем не менее, при запуске программ с привилегиями суперпользователя возникают очень серьезные последствия для безопасности, особенно если вы неправильно очищаете входные данные!

1 голос
/ 20 ноября 2011

Вы смотрели журнал ошибок Apache, как он говорит?Что там?

Почти наверняка ваш PHP-скрипт работает без достаточных разрешений для перезапуска Apache.Что, вероятно, к лучшему.Если вам действительно нужно, чтобы это работало, рассмотрите возможность создания корневого скрипта setuid для вызова из PHP (обратите внимание, что он не должен использоваться в рабочей среде и, вероятно, создаст дыру в безопасности).

Вы также можете написатьмаленький сервис, который работает от имени пользователя root и принимает команды для перезапуска Apache из вашего PHP-скрипта.Это был бы более «правильный» способ сделать это, хотя задача, стоящая перед нами, сама по себе кажется неправильной, поэтому я не уверен, что вы должны продолжать идти по этому пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...