我的论文包括创建一个管理界面,管理员可以在其中批准请求访问权限的用户使用 开放星云。
批准后,用户应被添加到 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");
?>