Я использую Ubuntu 11.10. Я хочу иметь возможность вызывать сценарий оболочки из php и запускать этот сценарий от имени пользователя root. Когда мой php пытается вызвать скрипт оболочки как root - как это:
$output = shell_exec('sudo /var/www/my_script.sh')
я получаю эту ошибку в журнале apache:
sudo: no tty present and no askpass program specified
Я сменил владельца PHP-скрипт для root: root. Я добавил эту строку в sudoers:
www-data ALL = NOPASSWD:/var/www/my_script.php
Я понимаю, что я должен закомментировать эту строку в sudoers:
Defaults requiretty
Однако в моей нет такой строки файл sudoers. Что мне нужно сделать, чтобы обойти эту ошибку?
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (как пользователь: apache / www-data или root, если необходимо). Получите это здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
//Setting the second argument in getShell():
//true will return a shell with root
//false will return a shell with the php execution user
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('/var/www/my_script.sh');
Используйте "suexec"... в сервере Ubuntu 10.04:
sudo apt-get install apache2-suexec-common
Включите suexec:
sudo a2enmod suexec
Отредактируйте файл конфигурации для соответствия сайту:
sudo -e /etc/apache2/suexec/www-data
Затем посмотрите Используя suEXEC на Apache.org для конфигурирования файла (файлов) конфигурации Apache.
Другой подход...
Позвольте www-пользователю-данных работать для выполнения program1 и program2 без пароля:
sudo visudo
Добавьте к содержанию sudoers файла:
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
Сохранить.
Еще один с suPHP
Ваша строка sudoers предоставляет доступ для выполнения «my_script.php», пока ваш shell_exec вызывает «my_script.sh». Когда пароль не требуется, опция requiretty должна быть неактуальной.