2015-09-30 3 views
0

У меня есть скрипт bash, который принимает параметр, вызывается в PHP через shell_exec (параметр script.sh). В принципе, моя цель - вызвать скрипт, принадлежащий другому пользователю, который не является apache.PHP Bash Script, вызывающий другой скрипт Bash

script.sh сценарий представляет собой файл, который содержит следующие элементы (сейчас есть некоторые обработки команд ошибок):

#/bin/bash 
whoami>>whoami 
echo $1 >> parameter 
while read f; do 
env>>envoutput 
sudo -i -u archivescriptowner /path/to/archivescript.sh -command archive >> output 
done < $1 

В моей/и т.д./sudoers файла, у меня есть следующие:

apache ALL=(archivescriptowner) NOPASSWD: /bin/bash -c /path/to/archivescript.sh * 

Когда я запустил этот скрипт, выполнив su -s /bin/bash apache и передав параметр, он работает.

Когда я запускаю его через мою кнопку в PHP, archivescript.sh не выполняет

Whoami файл Apache написал ему

Файл параметров имеет право файл, написанный на него

окр показывает следующее

Term=xterm 
LD_LIBRARY_PATH=/path/to/library 
PATH=/sbin/:usr/sbin:/bin:/usr/bin 
PWD=/var/www/html 
LANG=C 
SHLVL=4 
=/bin/env 

PWD выводит право, то есть, где мой сценарий прямо сейчас, он будет перемещен в будущем.

Выходной файл, когда он запускается нажатием кнопки, пуст.

Я в затруднении относительно того, почему это не работает. Любое понимание было бы полезно. Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

+0

Я думаю, что 'sudoers' вход должен просто сказать,'/путь/к/archivescript.sh', без '/ bin/bash -c' перед этим. – Barmar

+0

Нет, это вряд ли имеет какое-либо отношение к проблеме. Здесь очень много здесь, что очень важно - верхушка моего списка вещей, чтобы проверить, является ли флаг -i 'причиной осложнений, и если веб-сервер работает с chroot. – symcbean

+0

@Barmar Убирает/bin/bash -c запрашивает пароль при входе в систему как пользователь apache и не работает для php. При этом, если я удалю sudo -i, удаление/bin/bash -c работает для пользователя apache, но не с php. – user3481541

ответ

1

Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash. Получить его здесь: https://github.com/merlinthemagic/MTS

После загрузки вы бы просто использовать следующий код:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 

$return1 = $shell->exeCmd('/path/to/archivescript.sh'); 

echo $return1; //return from your script