Я хочу разработать несколько скриптов на 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 или что-то в этом роде, и то, что я пытаюсь сделать, в принципе возможно. Но мне нужна ваша помощь, чтобы понять, какой кусок мне не хватает?
Большое спасибо!
Если вы возьмете решение troyengel по добавлению записи в корневую таблицу cron, а затем немного измените его, у вас может быть работоспособное решение.
Если вам абсолютно необходимо использовать apache для сигнализации о перезапуске интерфейса, почему бы PHP не создать файл, который действует как флаг, а затем выполнить корневую задачу cron, которая запускается каждую минуту (или что-то еще), на предмет наличия этого флага. Если он существует, перезапустите интерфейсы. Если этого не произойдет, умри. (не забудьте, что cronjob удалит флаг после успешного перезапуска интерфейса).
Этим достигается цель (перезапуск интерфейса, запускаемый из apache / php) и устраняются все возможные проблемы, связанные с предоставлением доступа к корневому уровню веб-службы / службы сценариев.
Делает этот отвечает на ваш вопрос?
Вы должны вызвать команды, которые вам нужно запустить от имени другого пользователя, используя sudo
- затем установите sudoers
файл конфигурации соответствующим образом, чтобы пользователю, запускающему сценарий PHP, было разрешено запускать сценарии от имени другого пользователя. Видеть sudoers
(5) и около дюжины предыдущих вопросов, касающихся использования sudo.
Вам нужно будет написать их как инструменты, управляемые командной строкой PHP (убедитесь, что пакет php-cli установлен через yum), а затем запускать их в корневом crontab напрямую, а не как обычный пользователь. Вы, вероятно, захотите написать его и в базовом сценарии bash (shell), использование php было бы излишним, если вы просто запускаете команды через exec ().
вы можете использовать липкий бит, чтобы запустить сценарий оболочки от имени пользователя root. однако для этого потребуется немного больше усилий.
Однако вы не можете просто установить uid в сценарии оболочки. Вам нужно сделать обычный исполняемый файл, скажем, на C / C ++, что-то, что не вызывает интерпретатор, как это делают сценарии оболочки, и заставляет его выполнять сценарий оболочки.