3

我正在做一些开发工作,将嵌入式 Linux 用于操作系统,将Boa用于 Web 服务器。我有一个发布到 CGI 脚本、处理表单数据和回复的网页。我的开发环境是 Ubuntu,一切正常,但是当我将代码移植到嵌入式 Linux 时,CGI 模块没有实例化(或者至少似乎没有实例化)。这是我的代码的精简部分。print 语句抱怨一个未初始化的变量。

use CGI;

use strict;
use warnings;

my $cgiObj = CGI->new();

print $cgiObj->param('wlanPort');

同样,这在我的开发环境中工作正常,但在嵌入式环境中失败。CGI.pm 已安装并且在 CGI->new() 命令上没有生成错误。我还验证了表单数据正在发送,但显然不能保证 Perl 脚本正在接收它。

我觉得这是一个 Boa 配置问题,这就是我接下来要研究的问题。我对 Perl 还很陌生,所以我不确定还能做什么。有任何想法吗?

编辑:绝对不是 Boa 配置问题。仍在调查中。

更新:我已将代码简化为以下内容:

#!/usr/bin/perl
use CGI qw(:standard);
$data = param('wlanPort') || '<i>(No Input)</i>';
print header;                            
print <<END; 
<title>Echoing user input</title>
<p>wlanPort: $data</p>           
END  

正如预期的那样,它打印(无输入)

我还应该指出,表单是 enctype="multipart/form-data" 因为我必须具有文件上传功能并且我使用的是“POST”方法。

我使用 HttpFox 插件检查发布数据并检查 wlanPort 值:

-----------------------------132407047814270795471206851178 内容处置:表单数据;名称="wlanPort"

eth1

所以它几乎肯定会被发送......

更新 2:我在我的 Ubuntu 笔记本电脑的嵌入式系统中安装了相同版本的 Perl 和 Boa。在笔记本电脑上工作,而不是在设备上工作,结果是一样的。我已经告诉我的雇主,除了 Boa 和 (Micro) Perl 在设备上与在 Ubuntu 中构建的方式之外,我已经用尽了所有可能性。

4

2 回答 2

1

CGI 是一个非常简单的协议,虽然我无法直接回答您的问题,但我可以建议一些技术来帮助隔离问题。

如果您的表单是通过 POST 提交的,那么该表单的内容将在您的脚本正在获取的 HTTP 请求的内容中显示为 URL 编码字符串。完全不使用 CGI 模块,您应该能够从 STDIN 读取请求:

my $request = "";
while (<STDIN>) {
   $request .= $_;
}

if (open my $out, ">>/tmp/myapp.log") {
    print $out $request;
    close $out;   
}

然后,您可以检查 /tmp/myapp.log 以查看您是否从请求中获得了您认为的所有信息。

为了完整起见,如果您的表单通过 GET 提交,那么参数将在环境变量 QUERY_STRING 中,您可以在 Perl 中使用 $ENV{'QUERY_STRING'} 查看它。

CGI 的对象接口和功能接口解析请求的方式应该没有区别。我不熟悉 boa,但我无法想象它会破坏基本的 CGI 协议。

一个常见的问题是您将表单参数命名为一件事,并在 CGI 脚本中寻找不同的参数名称。那总是一个笑声。

祝你好运,希望这对一些人有所帮助。

于 2011-08-19T15:49:20.187 回答
1

我知道这是一个非常古老的帖子,OP 可能对与此相关的任何新信息不感兴趣,但是关于如何调试 CGI 脚本的一般问题仍然有一些相关性。我在开发与生产环境中遇到了类似的问题。为了帮助那些偶然发现这个线程的人,我发布了我处理这种情况的经验。我的简单答案是,使用 Log::Log4perl 和 Data::Dumper 模块来揭开这个神秘面纱(假设有一种方法可以访问您的 prod 环境中的日志)。通过这种方式,开销可以忽略不计,您可以在问题蔓延时打开跟踪(即使代码以前工作过,但由于随着时间的推移发生变化,它开始失败)。在适当的日志级别(跟踪、调试、信息、警告、错误、致命)记录每一个相关的信息位,并配置适合操作的级别。没有这些机制,很难深入了解生产操作。希望这可以帮助。

use CGI;
use Log::Log4perl qw(easy);
use Data::Dumper;

use strict;
use warnings;

my $cgiObj = CGI->new();

my $log = Log::Log4perl::get_logger();
$log->trace("CGI Data: " . Dumper($cgiObj));

print $cgiObj->param('wlanPort');
于 2018-08-01T14:12:24.550 回答