【问题标题】:php exec() and shell_exec()php exec() 和 shell_exec()
【发布时间】:2012-12-16 01:08:00
【问题描述】:

我目前有一个我的网络服务器提供的 php 页面。为了显示我需要在页面上显示的所有信息,我需要从外部 python 脚本输出。所以我一直在使用php的exec()命令来执行python脚本,并将输出捕获到一个字符串数组中,如下所示:

$somequery = $_GET['query'];
$result = exec("python /var/www/html/query/myscript.py ".somequery."");

//some for loop to loop through entries in result and echo them.

然而,从来没有任何要打印的条目,但是当我直接在服务器的控制台上运行命令时,它会正确输出。我尝试在我正在执行的网页上回显命令,这是正确的命令。我认为唯一可能是 exec() 不会在 php 程序完成之前停止其余部分的执行,导致循环我打印出发现 $result 为空的条目。

如何确保 exec() 在我的 php 脚本的其余部分之前完成执行? php.ini 中是否有我需要更改的设置?我不完全确定。

编辑:我尝试运行和存储 shell_exec("echo hello"); 的输出并打印该输出,它现在打印。但是,当运行我的命令需要几秒钟的时间时,程序在转到下一行之前永远不会完成执行它。

编辑 2:我在下面的帖子 https://stackoverflow.com/a/6769624 中找到了我的解决方案我的问题与我正在使用的 numpy python 包有关,我只需要注释掉 /usr/lib64/python2.7/ctypes/ 中的行init.py 像海报一样,我的脚本输出正确。

【问题讨论】:

  • 这已经是asked
  • 仅供参考,这完全不安全。任何人都可以运行您的 Web 服务器用户有权访问的任何内容。小心exec()
  • 可能有人问过,但这些答案都没有回答我的问题。我也知道这不安全,但这不适用于生产环境……只是概念证明。
  • php exec 总是等待完成
  • 我认为您需要使用 python 二进制文件的完整路径,例如/usr/bin/python

标签: php


【解决方案1】:

获取shell输出的正确方法是这样的:

exec("python /var/www/html/query/myscript.py ".somequery."", $result);

var_dump($result); //output should be in here

试一试。

【讨论】:

  • 附带说明:将 $_GET 值直接放入您的 exec() 命令而不进行任何清理是非常危险的。简单的例子,如果有人将 $_GET['query'] 插入为 ` && rm -rf /` (不要尝试这样做),你只是删除了整个服务器。请务必对其进行某种消毒。
  • php.net/manual/en/function.escapeshellarg.php 当我实际在可访问的服务器上运行它时,我会使用它。另外,我按照你的方式运行后做了一个 var_dump,我只是得到了 array(0) {}
猜你喜欢
  • 2011-10-28
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多