Пользователю Apache www-data
необходимо предоставить привилегии для запуска определенных приложений sudo
.
- Запустите команду
sudo visudo
. На самом деле мы хотим отредактировать файл в. etc/sudoers
Чтобы сделать это, используя sudo visudo
в терминале, он дублирует (временный) sudoers
файл для редактирования.
- В конце файла добавьте следующее, например: -если мы хотим использовать команду для
restart
копчения и php
команду для другого действия в вашем вопросе,
www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php
(Это предполагает, что вы хотите запускать restart
и php
команды, используя привилегии суперпользователя (root). И вы используете php
команду в usr/bin/
пути)
Однако, если вы хотите запускать каждое приложение, используя привилегии суперпользователя, добавьте следующее вместо того, что указано выше. Возможно, вы не захотите делать это, не для ALL
команд, это очень опасно.
www-data ALL=NOPASSWD: ALL
3. После редактирования файла sudoers ( visudo
мы редактируем временный файл, sudoers
поэтому сохраняем и выходим из временного файла (visudo) для записи в sudoers
файл. ( wq!
)
4. Вот и все, теперь используйте exec()
или shell_exec
следующим образом внутри вашего xxx.php
скрипта. Не забудьте использовать sudo
перед использованием команды в сценарии php.
например: -
exec ("sudo /etc/init.d/smokeping restart 2>&1");
или
shell_exec("sudo php -v");
Так что в вашей проблеме добавьте команды, которые вы хотите использовать в к, step no (2.)
как я добавляю, и измените ваш php-скрипт на то, что вы хотите.
здесь та же проблема, что и у вас /programming//a/22953339/1862107
Попробуйте указать полный путь к бинарному файлу php. Например,
/usr/bin/php
Если вы этого не знаете, найдите его, используя:
which php
источник
/var/log/httpd/error*
.Как правило , вы хотите , чтобы указать полные пути к приложениям , таким как
whoami
,ls
иphp
. Если вы не уверены, каково расположение программы (полный путь), вы можете узнать так:Затем укажите это так в вашем сценарии.
источник
echo shell_exec("/usr/bin/php somefile.php 2>&1")
?hu
. Таким образом , вы должны убедиться , что скриптphp
пытается бежать устанавливаются следующим образом:chmod 755 somescript.php
. Это позволит пользователю, на котором работает Apache, иметь возможность выполнять и читать ваш.php
файл.Ваш php.ini ограничивает доступный набор команд?
Это из моего
/etc/php5/php.ini
источник
Как отладить проблемы с shell_exec
Хорошо, здесь у нас проблема: что-то работает в терминале и не работает в shell_exec php (или exec, spawn, как угодно). Давайте подумаем: в чем разница между вами и php? Вот три:
PHP выполняется из правил HTTP-сервера
Действительно, Ваш терминал работает от
yourname
пользователя, а php - от пользователяwww-data
. Итак, первая идея - открыть терминал отwww-data
пользователя и попробовать ту же команду. Так..../etc/passwd
файл, найдите строку сwww-data
пользователем и измените его оболочку входа (последнюю) с/bin/false
(или как угодно) на/bin/bash
.www-data
терминал:su www-data
/etc/passwd
файл, пока все готовоPHP выполняется из PHP .
PHP достаточно параноидален, и в настройках apache / nginx и php.ini есть много опций, которые могут помешать вашей попытке.
Это немного сложнее для отладки. Здесь есть два варианта:
Включите логи в браузере и увидите проблему. Отредактируйте свой
php.ini
, включитеdisplay_errors
и все остальные флаги, чтобы увидеть ошибки в браузере. Вы можете прочитать и отладить их.Получить
www-data
оболочку (см. Первый раздел) и выполнить что-то вродеecho '<?php shell_exec("php -v"); ?>' | php
который выполнит тот же код php в консоли, и вы сможете увидеть ошибки и отладки.
PHP выполняется из SELinux / apparmor
Selinux и apparmor - это средства безопасности, которые запрещают приложениям выполнять определенные действия (например, порождать другие приложения или некоторые другие конкретные приложения). Возможно, он включен на вашем сервере.
Чтобы проверить - отключите selinux / apparmor и проверьте, существует ли проблема.
Чтобы исправить - прочитайте соответствующее руководство и исправьте напишите разрешительные правила для Вашего случая.
источник
Для меня самым простым способом было зайти внутрь php.ini и прокомментировать строку, начинающуюся с
источник