
Я хочу разработать несколько скриптов на PHP, которые будут вызывать следующие команды; используя функцию exec()
service network restart
crontab -u root /xyz/abc/fjs/crontab
и т. д.
Проблема в том, что Apache выполняет скрипт от имени пользователя Apache (я работаю на CentOS 5), независимо от добавления Apache в Wheel илиделать добро, зло и уродство групповое назначение не запускает команды (как указано выше).
Ниже приведены мои конфигурации;
Мой /etc/sudoers
root ALL=(ALL) ALL
apache ALL=(ALL) NOPASSWD: ALL
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
Поскольку я перепробовал несколько комбинаций с sudoer и httpd.conf, последний httpd.conf выглядит примерно так:
мой httpd.conf
User apache
Group wheel
мой PHP-скрипт
exec("service network start", $a);
print_r($a);
exec("sudo -u root service network start", $a);
print_r($a);
Выход
Array
(
[0] => Bringing up loopback interface: [FAILED]
[1] => Bringing up interface eth0: [FAILED]
[2] => Bringing up interface eth0_1: [FAILED]
[3] => Bringing up interface eth1: [FAILED]
)
Array
(
[0] => Bringing up loopback interface: [FAILED]
[1] => Bringing up interface eth0: [FAILED]
[2] => Bringing up interface eth0_1: [FAILED]
[3] => Bringing up interface eth1: [FAILED]
)
Без всякого удивления, когда я вызываю перезапуск сетевых служб через ssh, используя похожего пользователя, например, apache, команда успешно выполняется. Все дело в доступе к таким командам через протокол HTTP. Я уверен, что программное обеспечение типа cPanel/Plesk использует что-то вроде sudoer или что-то в этом роде, и то, что я пытаюсь сделать, в принципе возможно. Но мне нужна ваша помощь, чтобы понять, какую часть я упускаю?
Большое спасибо!
решение1
Если вы возьмете решение troyengel по добавлению записи в корневую таблицу cron, а затем немного измените его, то у вас может получиться работоспособное решение.
Если вам абсолютно, безусловно нужно использовать apache для сигнализации о перезапуске интерфейса, почему бы не заставить PHP создать файл, который будет действовать как флаг, а затем заставить ваш root cronjob, который будет запускаться каждую минуту (или сколько угодно), проверять наличие этого флага. Если он существует, перезапустите интерфейсы. Если нет, умрите. (не забудьте удалить флаг cronjob после успешного перезапуска интерфейса).
Это достигает цели (перезапуска интерфейса, запущенного из apache/php) и обходит все возможные проблемы, связанные с предоставлением доступа корневого уровня веб-службе/службе сценариев.
решение2
Вам придется написать их как PHP-инструменты командной строки (убедитесь, что пакет php-cli установлен через yum), а затем запустить их в корневом crontab напрямую, а не как обычный пользователь. Вы, вероятно, захотите написать его также в базовом скрипте bash (shell), использование php было бы излишним, если вы просто запускаете команды через exec().
решение3
Вам следует вызывать команды, которые вам нужно запустить от имени другого пользователя, используя sudo
--, а затем соответствующим образом настроить sudoers
файл конфигурации, чтобы пользователю, который запускает PHP-скрипт, было разрешено запускать скрипты от имени другого пользователя. См. sudoers
(5) и около дюжины предыдущих вопросов относительно использования sudo.
решение4
Вы можете использовать липкий бит, чтобы запустить скрипт оболочки от имени root. Однако сделать это немного сложнее.
Однако вы не можете просто установить setuid на скрипт оболочки. Вам нужно создать обычный исполняемый файл, скажем, на C/C++, что-то, что не вызывает интерпретатор, как скрипты оболочки, и заставить его выполнить скрипт оболочки.