我的文件.pl
system("./read_image http://echopaw.fr/wp-content/uploads/2015/09/animals-41.jpg");
read_image
是一个C可执行文件,它在命令行中运行良好,但是当我在Web服务器上运行.pl
文件时,这行不起作用,它的功能是写一些数据到一个文件,所以我可以看看它是否有效
我也试过``,但它仍然无效
任何人都有一些想法?
答案 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
时使用该路径。