从 PHP 调用 shell 脚本,以 root 身份运行

从 PHP 调用 shell 脚本,以 root 身份运行

我正在运行 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');

相关内容