如何将变量从一个CGI脚本传递到另一个?

时间:2017-05-24 19:39:03

标签: perl cgi

我有一个名为install-app-pl.cgi的CGI perl脚本:

#!/usr/bin/perl -w

print header('text/html');

use strict;
use CGI ':standard';

# Get me some vars

my @params = param();

my $APP_NAME          = param('app_name');
my $APP_WEB_PORT      = param('app_web_port');
my $APP_WEB_USER      = param('app_web_user');
my $APP_WEB_PASS      = param('app_web_pass');
my $DOWNLOAD_DIR      = param('download_dir');
my $CONFIG_DIR        = param('config_dir');
my $LIBRARY_DIR       = param('library_dir');
my $TEMP_DOWNLOAD_DIR = param('temp_download_dir');

# Run another script

if ( $APP_NAME ) {
    print "Installing $APP_NAME...";
    print "<pre>";
    system ("perl /var/www/mysite.local/public_html/lib/$APP_NAME/install-$APP_NAME.pl");
    print "</pre>" ;
}
else {
    print "No app specified, check the error log";
}

我试图让它将CGI参数中定义的变量传递给install-$APP_NAME.pl

#!/usr/bin/perl -w

print header('text/html');

use strict;
use CGI ':standard';

require "/var/www/mysite.local/public_html/cgi-bin/install-app-pl.cgi"

# Echo my vars

print "$CONFIG_DIR $DOWNLOAD_DIR $LIBRARY_DIR $PGID $PUID $TZ $APP_WEB_PORT";

但我不确定传递这些内容的最佳方式。

1 个答案:

答案 0 :(得分:2)

你确定install-app-pl.cgi是一个CGI程序吗?你确定它不仅仅是一个Perl命令行程序吗?我的意思是,我看到它是如何命名的,但使用system()这样调用CGI程序似乎很奇怪。

差异在这里至关重要。 CGI程序以不同的方式命令行程序访问它们的参数。

如果它真的是一个CGI程序,那么你有几个选择:

  • 向其发出HTTP请求(使用LWP bundle of modules中的内容。)
  • 使用CGI.pm的调试机制以与您当前调用它相同的方式调用它,但传递CGI参数,如foo=xxx&bar=yyy&baz=zzz(有关详细信息,请参阅DEBUGGING section of the CGI.pm documentation)。当然,这依赖于使用CGI.pm的程序,对我来说感觉有些笨拙。
  • 如果您使用system()从其他程序拨打电话,请问自己该程序是否真的需要成为CGI程序。然后决定将其重写为命令行程序。如果你想要CGI版本和命令行版本,那么你可以将大部分代码移动到一个模块,该模块可以被两个只提取参数的薄包装器使用。

关于您的代码的其他几点。

  • Perl 5.6(2000年发布)引入了use warnings pragma。大多数人现在使用它代替shebang线上的-w
  • 在加载定义它的CGI模块之前调用header()函数似乎很奇怪。它可以工作,因为use是在编译时处理的,但重新排序代码以使其更有意义会很好。
  • 同样。大多数人会将use strict(和use warnings)作为他们计划中的第一件事。在shebang线后立即。
  • system()返回进程的返回值。如果你的第二个程序产生你想要显示在网页上的有用输出,你应该使用反引号。
  • 如果您的所有输出都在<pre>元素中,为什么不删除该元素并返回内容类型“text / plain”呢?

更新:如果我没有重申许多人在你原来的问题的评论中已经说过的话,那将是我的疏忽 - 这听起来像是一个糟糕的主意。