Выполнение команды оболочки из PHP с помощью shell_exec

В мою диссертацию входит создание интерфейса администрирования, в котором администратор может утверждать пользователей, которые попросили предоставить доступ к OpenNebula .

После утверждения пользователи должны быть добавлены в OpenNebula (т.е. это соответствует команде oneadmin createuser username password ). ( Дополнительная информация об интерфейсе (раздел 4.2) .)

Я пытаюсь выполнить это с выполнением команды оболочки в файле PHP. Почему это не работает (ниже – только конкретный пример, а не общий код, который я использую)?

 $execQuery = "/bin/su oneadmin postgres -c '/usr/bin/oneuser create test10 test10'"; shell_exec ($execQuery); //execute query in shell. 

Это не работает (даже если я зарегистрирован как oneadmin, когда скрипт выполняется PHP):

 shell_exec ("/usr/bin/oneuser create test10 test10"); 

Он работает, когда я набираю эту команду в оболочке. Я попытался выполнить другие команды оболочки через php, и они работают нормально, поэтому я задаюсь вопросом, где проблема.

Я дал права на файл /usr/bin/oneuser rwx для всех пользователей.

В руководстве php для shell_exec показано, что функция возвращает вывод в виде строки. Если вы ожидаете выхода из запускаемой программы, вам необходимо зафиксировать ее так:

 $execQuery = "echo -n test_command"; $output = shell_exeeec($execQuery); echo $output; 

Ваш вопрос не показывает попытку захвата каких-либо данных. Если вы также не забудьте подключить stdout и stderr, когда вы запустите свою команду, вам лучше понять, что происходит. Чтобы использовать ваш пример:

 $out = shell_exec("/usr/bin/oneuser create test10 test10 2>&1"); var_dump($out); 

Это должно помочь вам понять, что происходит. Как предполагает Шадур , представляется вероятным, что эти программы ожидают, что интерактивный терминал сможет вводить пароли для запуска. Даже если они не требуют ввода, они могут ожидать интерактивные оболочки. И он прав, что su не играет в этом контексте. Тем не менее, есть правильный инструмент для работы.

Вы можете настроить sudo таким образом, чтобы ваш пользователь HTTP мог выполнить вашу программу как имя пользователя без пароля, но НЕ мог бы сделать что-либо еще, запустив visudo или что-нибудь, что вы используете для редактирования файла sudoers и добавив эту строку:

 http ALL=(username) /usr/bin/oneadmin 

Тогда в php ваша команда будет выглядеть примерно так:

 $execQuery = "sudo -u username /usr/bin/oneadmin postgres -c '/usr/bin/oneuser create test10 test10'"; $out = shell_exec ("$execQuery 2>&1"); echo $out 

Попробуйте passthru($cmd) ;

Это позволит пользователю вводить данные на экране терминала.

В первом случае su обычно запрашивает пароль при его запуске; shell_exec справляется с интерактивностью.

Я не знаю oneuser , может, он тоже попросит пароль?

Сначала вам нужно разрешить веб-серверу выполнять команды «Система». Однако в мои моменты я буду использовать CentOS6.3 64-разрядный LAMP-сервер .

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

 <?php echo shell_exec("whoami"); ?> 

в моем случае выход был apache , теперь давайте отредактируем sudoer и дадим разрешение для нашего apache .

введите команду ниже для ввода файла sudoer.

 visudo 

теперь добавьте конец строки вашего файла, таким образом, ваш apache получит полный доступ к корню из PHP-скрипта.

 apache ALL=NOPASSWD: ALL 

Теперь запустите скрипт с вашего PHP , это должно выглядеть как пользователь root ,

 <?php echo shell_exec("sudo whoami"); ?>