5

在我的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

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

4

5 回答 5

4

问题在于您的代码或 PHP。

问题在于您的权限。

php 使用在 apache 的 env-vars 中设置的权限。

理想情况下设置为:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

在您的 apache2 / httpd conf 文件下。

例如:

尝试运行:

<?= `whoami` ?>

通过您的外壳和浏览器。

您的浏览器可能会显示 www-data 和 shell 会显示您的用户名,或者如果您在 AWS - 默认情况下,您会得到root

您不必使用system()exec()而是使用。

我们应该接近:

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

执行操作将要求您设置正确的用户和组。

查找:在 shell 中,“2>&1”是什么意思?

所以你的代码应该是:

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

希望能帮助到你!

于 2013-03-16T05:58:40.373 回答
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"

正如预期的那样。

于 2013-03-16T05:43:59.457 回答
0

我怀疑它不在路径中。尝试:

键入 python 命令的完整路径(例如/usr/bin/python --version

  1. 使用命令 which, 'which python' 找出

  2. 尝试从命令行执行你的脚本,'php script.php' => 有时网络服务器会设置不同的东西

  3. 确保启用了错误显示

    ini_set('display_errors',1);

于 2013-03-05T12:08:32.940 回答
0

这有点骇人听闻,但即使您不允许执行 python(“用户”CI 就是这种情况),您也可以找到带 1 个小数的版本号。

//find python path
exec("which python", $path);

//show all subdirs in python    
exec("ls -l ".$path[0]."*", $output);
$output = implode("\n", $output);

//preg match on version numbers    
preg_match_all("#python(\d+(?:\.\d{1,2})?)#", $output , $matches);
$installed_versions = $matches[1];

//sort in reversing order
$versions_sorted_desc = array_reverse($installed_versions);

//latest version is element 0
$latest_version = $versions_sorted_desc[0];

echo $latest_version;
于 2013-03-15T10:47:13.140 回答
0

系统只返回最后一行。 系统

public function deploy_test() {

      system("python --version", $out);
      echo json_encode(implode($out));
 }
于 2013-03-05T15:24:54.990 回答