无法在cgi

时间:2016-03-19 12:44:27

标签: c perl cgi

我的文件.pl

中有此行代码
system("./read_image http://echopaw.fr/wp-content/uploads/2015/09/animals-41.jpg");

read_image是一个C可执行文件,它在命令行中运行良好,但是当我在Web服务器上运行.pl文件时,这行不起作用,它的功能是写一些数据到一个文件,所以我可以看看它是否有效

我也试过``,但它仍然无效

任何人都有一些想法?

1 个答案:

答案 0 :(得分:2)

我认为这是因为当您的网络服务器运行您的CGI时,它会从某个奇怪的目录(/var/www/htdocs/或其他任何内容)执行此操作。然后,由于read_image,您的./read_image也应该在该目录中 ./表示当前目录,它不一定是.cgi所在的目录。
我建议使用Perl模块FindBin

你的cgi:

...
use strict;
use warnings;
use FindBin;

...
system("$FindBin::Bin/read_image http://echopaw.fr/wp-content/uploads/2015/09/animals-41.jpg");

$FindBin::Bin解析为.cgi所在的路径 - 无论您从哪里调用它。这是一个非常方便的模块,也可以用来pimp @INC路径来找到你自己的模块:

use lib "$FindBin::Bin/../lib";
use MyModule;

这种方式MyModule.pm预计位于$current_script_path/../lib。非常方便。

附录

随着讨论的发展,这显然不仅是apache是​​否可以找到read_image命令,而且read_image是否可以找到wget命令的问题试图执行。

正如@CDahn在评论中已经注意到的,出于安全原因,apache运行带有有限环境的CGI脚本等。如果你从shell运行read_image,那么你就拥有了一个完整的工作环境,比如PATH包括15个不同的目录(比如/usr/bin:/opt/bin:/usr/share/bin:/usr/local/bin:...,无论如何)。当apache运行您的脚本时,PATH可能只包含绝对必要的2或3个目录,例如/usr/bin:/usr/local/bin。这同样适用于其他环境变量。

您可以使用一个简单回显当前环境的.cgi脚本来验证这一点,例如

while (my ($key,$value) = each %ENV) {
    print "$key=$value\n";
}

(取自http://perldoc.perl.org/functions/each.html
从您的浏览器调用此.cgi,您将看到差异。

当你的read_image找不到wget命令时,可能因为wget位于PATH apache中而不知道。我会在wget程序中给出read_image命令的完整路径,而不是教授关于附加目录的apache(坏主意)。从终端窗口运行

$ which wget
/usr/bin/wget

并在从wget调用read_image时使用该路径。