使用 shell_exec 从 PHP 执行 shell 命令

使用 shell_exec 从 PHP 执行 shell 命令

我的论文包括创建一个管理界面,管理员可以在其中批准请求访问权限的用户使用 开放星云

批准后,用户应被添加到 OpenNebula(即它对应于命令oneadmin createuser username password)。 (接口的更多信息(第 4.2 节).)

我正在尝试通过在 PHP 文件中执行 shell 命令来执行此操作。为什么这不起作用(下面只是一个具体示例 - 不是我正在使用的通用代码)?

$execQuery = "/bin/su oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
shell_exec ($execQuery); //execute query in shell.

这也不起作用(即使我以 oneadmin 身份登录,当脚本由 PHP 执行时):

shell_exec ("/usr/bin/oneuser create test10 test10");

当我在 shell 中输入该命令时它就起作用了。我尝试通过 php 执行其他 shell 命令,并且这些命令工作正常,所以我想知道问题出在哪里。

我已将文件/usr/bin/oneuser rwx权限授予所有用户。

答案1

PHP 手册shell_exec,它表明该函数以字符串形式返回输出。如果您期望启动的程序输出,则需要像这样捕获:

$execQuery = "echo -n test_command";
$output = shell_exec($execQuery);
echo $output;

您的问题并不表明您试图捕获任何数据。如果您还确保在运行命令时连接 stdout 和 stderr,您应该更好地了解正在发生的情况。使用你的例子:

$output = shell_exec("/usr/bin/oneuser create test10 test10 2>&1");
var_dump($output);

这应该可以帮助您了解发生了什么。作为沙杜尔建议,这些程序似乎需要一个可以输入密码才能运行的交互式终端。即使不需要输入,他们也可能期望交互式 shell。他是对的,su在这种情况下效果并不好。然而,有一个正确的工具可以完成这项工作。

您可以进行设置sudo,以便您的 http 用户可以作为用户名执行您的程序,无需密码,但不能通过运行visudo或任何您用来编辑 sudoers 文件并添加以下行来执行任何其他操作:

http    ALL=(username) /usr/bin/oneadmin

然后在 php 中你的命令将如下所示:

$execQuery = "sudo -u username /usr/bin/oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
$out = shell_exec ("$execQuery 2>&1");
echo $out

答案2

尝试passthru($cmd);

它将允许用户在终端屏幕上进行 I/O。

答案3

第一种情况,su运行时一般会要求输入密码;shell_exec不能很好地处理交互性。

我不知道oneuser,也许它也试图要求输入密码?

答案4

首先,您需要允许您的网络服务器执行系统命令。然而在我的瞬间我将使用 CentOS6.3 64 位灯服务器

首先我们需要知道我们的 apache 使用的当前用户,在大多数情况下是它apache,让我们通过 PHP 检查用户名以确保我们的用户名。

<?php
    echo shell_exec("whoami");
?>

就我而言,输出是apache,现在让我们编辑sudoer并授予我们的权限apache

输入以下命令进入 sudoer 文件。

visudo

现在将以下行添加到文件末尾,这样您的 apache 将从 PHP 脚本获得完全 root 访问权限。

apache  ALL=NOPASSWD: ALL

现在从您的运行以下脚本PHP,您应该将用户视为,

<?php
    echo shell_exec("sudo whoami");
?>

相关内容