Как выполнить команду оболочки из php-скрипта

Я хотел бы создать php-скрипт для выполнения команды оболочки и возврата ее вывода. Сервер требует закрытый ключ. Когда я впервые решил проверить это, я создал это:

<?php
$command = "ls";
$output = shell_exec($command);
echo "<pre>$output</pre>";
?>

Это сработало просто отлично. Но когда я изменил $command на команду, которую очень хотел запустить:

$command = "/etc/init.d/mycontrollerd status /etc/mycontrollerconfig";

это дало мне этот вывод:

You need root privileges to run this script

Я предполагаю, что мне нужно использовать sudo. Конечно, для этого потребуется разместить файл pem где-нибудь на сервере. Предполагая, что я это сделаю, каким именно должно быть $command? Должен ли я использовать shell_exec(), exec(), system() или что-то еще?


person Kenneth Vogt    schedule 13.07.2011    source источник


Ответы (2)


Неважно, какую функцию php вы используете для запуска скрипта — чего не хватает, так это авторизации вашей учетной записи пользователя.

Либо используйте sudo (предварительно настройте пользователя веб-сервера для запуска точной команды без пароля через visudo и добавьте к команде префикс sudo), либо настройте сценарий setuid, который выполняет команду сам по себе.

person phihag    schedule 13.07.2011
comment
Хотя также имеет значение, что учетная запись пользователя должна быть авторизована, это не означает, что нет лучшего выбора для использования PHP-функции. Что лучше? - person Kenneth Vogt; 07.08.2011
comment
@Kenneth Vogt exec, так как он без необходимости не задействует оболочку и возвращает результат, или passthru, который напрямую выводит результат, но потребует некоторой модификации исходного кода. - person phihag; 07.08.2011

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

См. также: PHP shell_exec() и sudo: должен быть установлен root

person Brad    schedule 13.07.2011
comment
Возникает вопрос: как настроить веб-сервер для работы от имени определенного пользователя, кроме «никто»? - person Kenneth Vogt; 07.08.2011
comment
@ Кеннет Фогт, откуда мне знать, ты не указал, какой сервер ты использовал. Если вы используете Apache, проверьте директивы конфигурации User и Group. (http://httpd.apache.org/docs/1.3/mod/core.html#user) Если вы не можете заставить это работать, уместно спросить об этом на ServerFault.com. - person Brad; 07.08.2011