在控制器中通过命令行执行Python - PHP/CodeIgniter

5 投票
5 回答
2264 浏览
提问于 2025-04-17 17:56

在我的 automation.php 控制器里,有一个这样的函数:

public function deploy_test() {

      echo json_encode(system("python --version"));
 }

当用户想要进行测试时,只需在网页上点击一个 test 按钮,就可以完成这个操作。不过,当我点击这个 test 按钮时,输出结果是:

""

与此同时,当我用命令执行同样的函数时:

public function deploy_test() {

    echo json_encode(system("ls -l"));
}

我得到的结果是:

total 32
drwxr-xr-x. 15 philippe philippe 4096 Mar  4 16:48 application
drwxrwxr-x.  2 philippe philippe 4096 Mar  4 17:28 css
-rw-r--r--.  1 philippe philippe 6357 Jan 30 11:53 index.php
drwxrwxr-x.  2 philippe philippe 4096 Feb 27 15:38 js
-rw-r--r--.  1 philippe philippe 2496 Jan 30 11:53 license.txt
drwxr-xr-x.  8 philippe philippe 4096 Jan 30 11:53 system
drwxr-xr-x. 12 philippe philippe 4096 Jan 30 11:53 user_guide

有人能帮我解决这个问题吗?

5 个回答

0

系统只返回最后一行的内容。

system 是一个用来执行命令的函数。

public function deploy_test() {

      system("python --version", $out);
      echo json_encode(implode($out));
 }
1

这个在我的生产服务器上运行得很好。

public function deploy_test() {
    echo json_encode(system("python --version 2>&1"));
}

输出结果是

Python 2.7.3
"Python 2.7.3"

这个Unix命令的输出结果打印了两次,因为system()本身会把结果输出到浏览器。所以可以用exec()来代替system,这样就可以避免这个问题。

public function deploy_test() {
    echo json_encode(exec("python --version 2>&1"));
}

它输出的结果是

"Python 2.7.3"

正如预期的那样。

4

问题不在你的代码或PHP上。

问题出在你的权限设置上。

PHP使用的是在Apache环境变量中设置的权限。

理想情况下,这些权限应该设置为:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

在你的apache2或httpd配置文件中。

举个例子:

试着运行:

<?= `whoami` ?>

通过你的命令行和浏览器来测试。

你的浏览器可能会显示为www-data,而命令行会显示你的用户名,或者如果你在AWS上,可能会显示为default,甚至可能是root

你不需要使用system(),可以用exec()来代替。

我们应该接近这样的设置:

echo json_encode(exec("python --version"));

执行操作时,你需要确保用户和组的设置是正确的。

可以查一下这个链接: 在命令行中,“2>&1”是什么意思?

所以你的代码应该是:

echo json_encode(exec("python --version 2>&1"));

希望这对你有帮助!

撰写回答