我正在运行 ubuntu 11.10。我希望能够从 php 调用 shell 脚本并以 root 身份运行该脚本。当我的 php 尝试以 root 身份调用 shell 脚本时,如下所示:
$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 文件中没有这样的行。我需要做什么才能解决这个错误?
答案1
您的 sudoers 行授予执行“my_script.php”的权限,而您的 shell_exec 正在调用“my_script.sh”。当不需要密码时,requiretty 选项应该无关紧要。
答案2
在 Ubuntu 10.04 服务器中使用“suexec”...:
sudo apt-get install apache2-suexec-common
启用 suexec:
sudo a2enmod suexec
编辑配置文件以匹配您的网站:
sudo -e /etc/apache2/suexec/www-data
然后看看使用 suEXEC在 Apache.org 上配置 Apache 配置文件。
另一种方法...
允许www-data用户运行程序1和程序2没有密码:
sudo visudo
在 sudoers 文件内容中添加:
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
节省。
还有一个是苏普
答案3
我最近发布了一个项目,该项目允许 PHP 获取并与真实的 Bash shell 交互(以用户身份: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');