3

使用 SSI,我可以简单地将其包含在我的 HTML 文件中,并且 CGI 脚本的输出会显示在页面上:

<!--#include virtual="script.cgi"-->

现在我正在尝试做同样的事情,但它不是 HTML 文件,而是在 PHP 文件中。我整天都在研究这个问题,每个解决方案都给我带来了以下问题。我将列出它们,从我认为应该工作以及晦涩难懂的开始...


1) <?php include("script.cgi"); ?>

结果: 没有执行。这只是打印出 CGI 文件的全部内容,就好像它只是一个文本文件一样。


2) <?php virtual("script.cgi"); ?>

结果: Fatal error: Call to undefined function virtual() in test.php on line #

这让我很困扰,因为我读到的所有内容都表明这是正确的做法。我不是 PHP 专家,但怎么可能virtual是“未定义函数”?它在官方 PHP 文档中被列为对 PHP 版本 5 有效。


3) <?php exec("script.cgi"); ?>

结果: 空白。没有什么。


4)

<?php
    $fd = fopen("script.cgi", "r");
    fpassthru($fd);
?>

结果: 没有执行。这只是打印出 CGI 文件的全部内容,就好像它只是一个文本文件一样。


5)<?php echo system("script.cgi"); ?>

结果: 喜忧参半。它会执行,但 CGI 脚本的“结果”会打印两次,并且前面是“Content-type: text/html”。这个我不明白。

Content-type: text/html resultresult

并通过删除echo...

<?php system("script.cgi"); ?>, 结果是...

Content-type: text/html result


6)<?php print("/usr/bin/perl script.cgi"); ?>

结果:没有执行。它只是打印出 print 语句 ( /usr/bin/perl script.cgi) 之后包含的内容。(我并不感到惊讶,但论坛中有人声称这对他们有用。)


那么我需要做什么才能执行并包含 CGI 文件的结果呢?这似乎应该很容易,但我不知道还能尝试什么。

我在有权编辑htaccess文件的 Apache/Linux 服务器 (cPanel) 上。它运行 PHP 版本 5.2.17。

是的,当我在浏览器中打开 CGI 文件时,它会执行并显示结果,因此我们知道服务器已配置为执行 CGI 文件。

4

7 回答 7

1

如果 PHP 作为 Apache 模块运行,则 CGI 变量在内部传递。在调用希望在环境中找到它们的 CGI 脚本之前,应该将它们复制到那里。

然后,CGI 脚本可能会在内容之前写入 HTTP 响应标头。似乎没有办法阻止 PHP 显示标题。所以脚本必须适当地处理脚本输出。

例如:

<?php
    foreach($_SERVER as $key => $value)
        putenv("$key=$value");
    $rtc = 0;
    $out = array();
    $mycgi = "/full/path/to/my/script.cgi";
    exec($mycgi, $out, $rtc);
    $in_header = true;
    foreach($out as $value)
    {
        if ($in_header)
        {
            if (strlen($value) == 0)
                $in_header = false;
            else
                header($value);
        }
        else
        {
            echo "$value\n";
        }
    }
    if ($rtc)
        error_log("$mycgi rtc=$rtc", 0);
?>
于 2020-11-08T13:20:24.283 回答
0

我已经尝试了所有方法,但似乎没有任何东西可以正常工作或根本没有。因此,对我来说,唯一的答案是不能应该这样做。此外,将 CGI/Perl 与 PHP 混合可能不是最佳实践。

将任何小的 CGI/Perl 脚本简单地重写为 PHP 应该不会太难。任何太大而无法重写的东西,那么在这种情况下,最好在整个站点上坚持使用 Perl。

于 2012-12-21T22:42:41.560 回答
0

尝试

passthru("/usr/bin/perl /full/path/script.cgi");
于 2012-05-08T23:51:02.697 回答
0

像 apache2 一样执行 CGI 怎么样?

我不断地将二进制 CGI 包装在 PHP5 中,没有任何问题。

您需要通过在 exec() 之前放置一些 putenv() 指令来模拟 Web 服务器调用,并使用 exec() 和 3 个给定参数(以检查返回值是否为 0)。

putenv() 可用于建立与 apache2 提供 CGI 完全相同的环境——它也适用于传递 URL 参数。

如果一个人可以选择用一种语言写作,那肯定会更好——

但是有些场景需要接口——是否只需要创建 I/O 包装器。

如果您不能以这种方式成功 - 如果您使用 cURL 调用 cgi,则 apache2 将通过调用创建所需的环境。这可能比要求的更复杂 - 更像是最后的手段。

对不起,我不能提供一个例子,可能足以说明它是如何工作的。

相反,它正在寻找一种从 CGI 执行 PHP 的方法 :)

于 2013-01-25T04:06:01.803 回答
0
<?php
$cgi = exec_cgi("path to cgi");
$cgi->addParameter->contentType("typeofcode");
?>
于 2014-03-12T16:09:18.560 回答
0

为我工作

<?
echo "sometextadd".shell_exec( "/dirtofile/filecontaincgi.cgi  | {

#commandinssh as sed 's/.*$/&<\/TR><TD>/' | and other

}")."sometextadd";

?>
于 2019-02-13T18:07:20.793 回答
-2

我从这里得到了以下对我有用的解决方案:link

为了方便起见,转储代码:

    <?php
    $data = file_get_contents("http://fullpathto.cgi",0);
    echo $data;
    ?>

安装程序是 C++ 编译的 .cgi 模块,在 zend 服务器 + unix box 上运行

于 2013-07-10T07:24:49.503 回答