запустить команду killall в функции php shell_exec

У меня есть рабочий сценарий оболочки, использующий killall для уничтожения всех экземпляров программы, как показано ниже:

убить абв

Теперь я пишу веб-страницу php для выполнения этого скрипта с помощью функции shell_exec:

shell_exec('sh ./myscript.sh');

Проблема в том, что мой php-код корректно работает в командной строке с "php myscript.php", но не работает в браузерах!. Однако я знаю, что пользователь в командной строке — «root», а в php — «apache» (я получаю это с помощью «whoami»). Дистрибутив Linux — Centos 6, использующий SElinux. Я изменил статус selinux на разрешающий.

Что я проверил:

  • PHP safe_mode выключен
  • shell_exec() отсутствует в disable_functions в php.ini

Есть ли способ запустить скрипты с помощью команды kill с помощью php?

Спасибо за помощь.


person sajebr    schedule 14.12.2013    source источник
comment
Любая ошибка PHP (проверьте error_reporting и display_errors)? каков код выхода выполняемой команды (используйте exec(), чтобы узнать)? у вас есть разрешение на kill целевой процесс?   -  person Ariyan    schedule 14.12.2013
comment
нет кода выхода и ошибок не сообщается! exec() также имеет аналогичный вывод, да, у меня есть разрешение на убийство, но у apache нет!   -  person sajebr    schedule 14.12.2013
comment
всегда есть код выхода! в случае успеха он равен 0, а ненулевой код ошибки! если у вас нет разрешения, вы не можете! когда вы запускаете его из апача, вы апач!   -  person Ariyan    schedule 14.12.2013
comment
да, но вопрос в том, как это сделать с apache?!   -  person sajebr    schedule 14.12.2013


Ответы (1)


вам либо нужно запустить apache как root (небезопасно), либо, что было бы намного безопаснее, вы должны запускать команды, которые вы пытаетесь убить, как «apache», или вы настраиваете свой файл sudoers, чтобы предоставить права apache для команды killall:

# vim /etc/sudoers
apache localhost=(ALL) NOPASSWD:/usr/bin/killall

а затем измените myscript.sh, чтобы сделать sudo killall abc

person klarki    schedule 14.12.2013
comment
Спасибо за ответ, я добавляю эту строку в файл /etc/sudoers, но проблема не решается... - person sajebr; 14.12.2013
comment
хорошо, попробуйте сделать # su apache, а затем введите $ sudo killall abc - person klarki; 14.12.2013
comment
это должно быть /usr/bin/killall в sudoers - person klarki; 14.12.2013
comment
когда я набираю # su apache в командной строке, вывод: Эта учетная запись в настоящее время недоступна! - person sajebr; 14.12.2013
comment
вы уверены, что apache работает как пользовательский apache? пожалуйста, проверьте, что находится в файле /etc/passwd и указанный там пользователь запускает apache, например, на моей машине этот пользователь www-data, или вы можете сделать ps -ef | grep apache и вставьте результат - person klarki; 14.12.2013
comment
соответствующая строка в /etc/passwd : apache:x:48:48:Apache:/var/www:/sbin/nologin - person sajebr; 14.12.2013
comment
вы изменили строку в sudoers на /usr/bin/killall (или где находится ваш файл killall)? если да, то измените /sbin/nologin в passwd на /bin/sh (или где вы sh) для пользователя apache, а затем попробуйте выполнить sudo killall abc - person klarki; 14.12.2013
comment
Я делаю все это. но все равно не работает. Нужна ли какая-либо команда для перезапуска или перенастройки файлов /etc/sudoers или /etc/passwd? - person sajebr; 14.12.2013
comment
для sudoers вы должны отредактировать его с помощью команды visudo, если она у вас установлена. Можете ли вы сделать su apache после изменения /etc/passwd? - person klarki; 14.12.2013
comment
да, я могу сделать su apache после изменения /etc/passwd, но проблема не решена! :-( - person sajebr; 14.12.2013
comment
что происходит, когда вы делаете sudo killall abc как apache? каков ваш путь к убийству ($ which killall)? остаются ли изменения в /etc/sudoers после выхода из файла? - person klarki; 14.12.2013
comment
когда я делаю su apache в терминале, а затем набираю killall abc, я получаю эту ошибку: операция не разрешена. и когда набираю sudo killall abc, он спрашивает у меня пароль! - person sajebr; 14.12.2013
comment
каков результат $ which killall - person klarki; 14.12.2013
comment
измените строку sudoers на apache ALL=(ALL) NOPASSWD:/usr/bin/killall и повторите попытку. - person klarki; 14.12.2013
comment
измените все строки killall abc в myscript.sh на sudo killall abc - person klarki; 14.12.2013