【问题标题】:How to execute a shell command from a php script如何从 php 脚本执行 shell 命令
【发布时间】:2011-10-04 21:07:22
【问题描述】:

我想创建一个 php 脚本来执行一个 shell 命令并返回它的输出。服务器需要私钥。当我第一次决定测试它时,我创建了这个:

<?php
$command = "ls";
$output = shell_exec($command);
echo "<pre>$output</pre>";
?>

效果很好。但是当我将$command 更改为我真正想要运行的命令时:

$command = "/etc/init.d/mycontrollerd status /etc/mycontrollerconfig";

它给了我这个输出:

You need root privileges to run this script

我猜我需要使用sudo。当然,这需要将 pem 文件放在服务器上的某个位置。假设我这样做,$command 究竟应该是什么?我应该使用shell_exec()exec()system() 还是别的什么?

【问题讨论】:

    标签: php shell-exec


    【解决方案1】:

    你使用哪个php函数来启动脚本并不重要——缺少的是你的用户帐户的授权。

    要么使用 sudo(预先配置 web 服务器用户通过 visudo 运行不带密码的确切命令,并在命令前加上 sudo),要么设置一个 setuid 脚本自行执行命令。

    【讨论】:

    • 虽然用户帐户必须获得授权很重要,但这并不意味着 PHP 函数没有最佳选择。哪个最好?
    • @Kenneth Vogt exec,因为它不需要涉及 shell 并返回结果,或者passthru,直接输出结果,但需要对原始代码进行一些修改。
    【解决方案2】:

    您真正需要做的是将您的网络服务器设置为作为特定用户(例如“nobody”除外)运行,或者授予该用户执行您想要执行的权限。

    另请参阅:PHP shell_exec() and sudo: must be setuid root

    【讨论】:

    • 这引出了一个问题:您如何“将您的网络服务器设置为以除 'nobody' 以外的特定用户身份运行”?
    • @Kenneth Vogt,我怎么知道,您没有指定您使用的服务器。如果您使用的是 Apache,请检查 UserGroup 配置指令。 (httpd.apache.org/docs/1.3/mod/core.html#user) 如果您无法使其正常工作,请前往 ServerFault.com。
    最近更新 更多