我有一个名为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";
但我不确定传递这些内容的最佳方式。
答案 0 :(得分:2)
你确定install-app-pl.cgi是一个CGI程序吗?你确定它不仅仅是一个Perl命令行程序吗?我的意思是,我看到它是如何命名的,但使用system()
这样调用CGI程序似乎很奇怪。
差异在这里至关重要。 CGI程序以不同的方式命令行程序访问它们的参数。
如果它真的是一个CGI程序,那么你有几个选择:
foo=xxx&bar=yyy&baz=zzz
(有关详细信息,请参阅DEBUGGING section of the CGI.pm documentation)。当然,这依赖于使用CGI.pm的程序,对我来说感觉有些笨拙。system()
从其他程序拨打电话,请问自己该程序是否真的需要成为CGI程序。然后决定将其重写为命令行程序。如果你想要CGI版本和命令行版本,那么你可以将大部分代码移动到一个模块,该模块可以被两个只提取参数的薄包装器使用。关于您的代码的其他几点。
use warnings
pragma。大多数人现在使用它代替shebang线上的-w
。header()
函数似乎很奇怪。它可以工作,因为use
是在编译时处理的,但重新排序代码以使其更有意义会很好。use strict
(和use warnings
)作为他们计划中的第一件事。在shebang线后立即。system()
返回进程的返回值。如果你的第二个程序产生你想要显示在网页上的有用输出,你应该使用反引号。<pre>
元素中,为什么不删除该元素并返回内容类型“text / plain”呢?更新:如果我没有重申许多人在你原来的问题的评论中已经说过的话,那将是我的疏忽 - 这听起来像是一个糟糕的主意。