Sua linha sudoers está concedendo acesso para executar "my_script.php" enquanto seu shell_exec está invocando "my_script.sh". Quando uma senha não é necessária, a opção requiretty deve ser irrelevante.
Estou executando o Ubuntu 11.10. Eu quero ser capaz de chamar um script de shell do PHP e executar esse script como root. Quando meu php tenta chamar o script shell como root - assim:
$output = shell_exec('sudo /var/www/my_script.sh')
Eu recebo esse erro no log do apache:
sudo: no tty present and no askpass program specified
Eu mudei o dono do script php para root: root. Eu adicionei esta linha para sudoers:
www-data ALL = NOPASSWD:/var/www/my_script.php
Eu percebo que devo comentar esta linha em sudoers:
Defaults requiretty
No entanto, não existe essa linha no meu arquivo sudoers. O que preciso fazer para superar esse erro?
Sua linha sudoers está concedendo acesso para executar "my_script.php" enquanto seu shell_exec está invocando "my_script.sh". Quando uma senha não é necessária, a opção requiretty deve ser irrelevante.
Use "suexec" ... no servidor Ubuntu 10.04:
sudo apt-get install apache2-suexec-common
Ativar o suexec:
sudo a2enmod suexec
Edite o arquivo de configuração para corresponder ao seu site:
sudo -e /etc/apache2/suexec/www-data
Depois, veja Usando suEXEC no Apache.org para configurar o (s) arquivo (s) de configuração do Apache .
Outra abordagem ...
Permita que o usuário www-data rode para executar program1 e program2 sem senha:
sudo visudo
Adicione ao conteúdo do arquivo sudoers:
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
Salvar.
Ainda outro é com suPHP
Eu publiquei recentemente um projeto que permite ao PHP obter e interagir com um shell Bash real (como usuário: apache / www-data ou root, se necessário). Obtenha aqui: link
Após o download, basta usar o seguinte código:
//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');
Tags command-line sudo php