Member 10390715 Ответов: 1

Как выполнить командную строку centos srcipt с помощью PHP?


Я хочу вызвать какой-нибудь скрипт командной строки в centos, используя, например, "shutdown-h now"...
У меня есть имя пользователя и пароль для привилегий root, но когда я использую браузеры для запуска php-файла, он не работает.
Вот мой PHP код:
<?php
   shell_exec('/sbin/shutdown -r now');
?>


Я также нахожу какой-то путеводитель, примерно такой:
php-использовать shell_exec () для перезапуска сервера? - переполнение стека[^]
но я думаю, зачем использовать это, пока у меня есть корневое имя пользователя и пропуск? И я не нашел каталог /etc/sudoer.
Пожалуйста, помогите мне. Спасибо

Что я уже пробовал:

Выполните командную строку Centos srcipt с помощью PHP, например, перезагрузите компьютер...

1 Ответов

Рейтинг:
8

Jochen Arndt

Цитата:
но я думаю, зачем использовать это, пока у меня есть корневое имя пользователя и пропуск?
У вас есть пароль, но он должен быть введен при необходимости. Как вы хотите это сделать, когда веб-сервер выполняет скрипт?

Цитата:
И я не нашел каталог /etc/sudoer
Это не каталог, а файл. И вы должны использовать visudo чтобы отредактировать этот файл вместо использования редактора.


Веб-сервер не будет запускать скрипт как корень В большинстве случаев PHP-скрипт запускается от имени пользователя, который запускает сервер (например, wwwrun или апаш).

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

Это можно сделать с помощью sudo (43.1.4.3.2. команда sudo[^]).

Но sudo запросит пароль, который не будет работать при вызове из скрипта, запущенного веб-сервером. Решение состоит в том, чтобы позволить конкретным пользователям выполнять команды spefic с помощью файл /etc/пользователям использовать sudo? файл (использовать visudo чтобы отредактировать этот файл).

Пример записи может выглядеть следующим образом
wwwrun ALL=(root) NOPASSWD: /sbin/shutdown


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

Переместитесь в папку, в которой вы хотите сохранить сценарий (например, /usr / local/bin) и создать скрипт (с именем reboot.sh здесь), используя ваш любимый редактор в корневой:
#!/bin/bash
/sbin/shutdown -r now

Сделайте скрипт исполняемым:
sudo chmod u+x reboot.sh

Теперь редактирование файлами sudoers и разрешить скрипт должен быть выполнен:
sudo visudo

Добавьте эту строку внизу (при условии, что PHP-скрипт выполняется от имени пользователя wwwrun)
wwwrun ALL=(root) NOPASSWD: /usr/local/bin/reboot.sh

Затем вызовите этот скрипт с помощью sudo
shell_exec('sudo /usr/local/bin/reboot.sh');


CPallini

5.

Member 10390715

Но как я могу найти пользователя PHP-скрипта?

Jochen Arndt

При выполнении скрипта имя пользователя указывается в переменной $USER.

Таким образом, вы можете поместить оператор в сценарий, чтобы записать его в файл:

echo "$USER " > /tmp/www_script_user.txt

или казнили, что:

shell_exec ('echo" $USER "> /tmp/www_script_user.txt')

Затем прочитайте содержимое файла (здесь из оболочки):

кот /tmp/www_script_user.txt

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

ps-aux | grep apache

В первом столбце будет показано имя пользователя (обычно wwwrun или www-data).

Member 10390715

Привет, я пользуюсь этим:
echo "$USER " > /tmp/www_script_user.txt а результат-это корень

Jochen Arndt

Когда ваш скрипт выполняется от имени root, в этом нет необходимости, и вы должны иметь возможность выполнить команду shutdown.

Но веб-сервер никогда не должен выполняться как root.

Member 10390715

Не знаю но здесь :(
[root@IPU ~]# ps-aux|grep apache
Предупреждение: плохой синтаксис, возможно, фальшивое" -"? См. /usr / share/doc/procps-3.2.7 / FAQ
apache 2625 0.0 0.6 66364 6444 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2626 0.0 0.6 66364 6444 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2627 0.0 0.6 66364 6444 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2628 0.0 0.6 66364 6444 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2629 0.0 0.6 66364 6444 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2630 0.0 0.4 66364 4956 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2631 0.0 0.6 66364 6444 ? S 22: 28 0: 00 / usr/sbin/httpd
apache 2632 0.0 0.4 66364 4956 ? S 22: 28 0: 00 / usr/sbin/httpd
root 3268 0.0 0.0 4028 700 pts/0 S+ 22: 32 0: 00 grep apache

Jochen Arndt

Таким образом, у вас есть Apache, работающий как пользователь "apache". Тогда я ожидал бы, что скрипт будет выполняться от имени того же пользователя (при запуске с веб-страницы).

Member 10390715

Но когда я выполните команду echo "$пользователь" &ГТ; /tmp/www_script_user.txt в командной строке Windows ====&ГТ; resutl является корень.
Как я могу переключить пользователя и запустить PHP с пользователем apache?

Jochen Arndt

Это должно быть запущено в скрипте При выполнении из Apache!

Если вы запустите его в командной строке, он покажет логин пользователя (и нет необходимости записывать результат в файл).

Member 10390715

Ладно, я понимаю. Но теперь у меня есть файл edit sudoers, чтобы
apache ALL=(root) NOPASSWD: /usr/local/bin/reboot.sh
И входит Брауэрс http://192.168.0.203/IPU-GUI/website2/reboot.php.
Но это все равно не сработает. :(

Jochen Arndt

Тогда пришло время для некоторой отладки, чтобы проверить, что происходит. Вы можете позволить PHP-скрипту выводить некоторый HTML-код для отображения в браузере. Или можно использовать уже показанный метод, чтобы позволить сценарию оболочки записать файл в reboot.sh:

echo "PHP-скрипт запущен как $USER" > /tmp/php_script.txt
/sbin / shutdown-r now & & gt;> /tmp/php_script.txt

"&Amp; & gt;> " второй команды добавит стандартный вывод и вывод ошибок в файл /tmp/php_script.txt.

Если файла нет, то PHP-скрипт не был выполнен. Затем проверьте журналы Apache и при необходимости позвольте php-скрипту напечатать немного HTML.

Обратите внимание, что Apache должен быть настроен на поддержку PHP (load modules) и разрешать выполнение скриптов.