【问题标题】:How can I pass variables from one CGI script to another?如何将变量从一个 CGI 脚本传递到另一个?
【发布时间】:2017-05-25 18:34:55
【问题描述】:

我有一个名为 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";

但我不确定传递这些信息的最佳方式。

【问题讨论】:

  • 所以你要根据用户输入在文件系统上执行东西而不彻底清理/限制数据?嗯...有趣的方法。
  • 您将参数传递给脚本,就像您将参数传递给任何 shell 进程一样。如果你有一堆,传递序列化表示(例如 JSON)或使用某种持久存储(例如文件、数据库)可能更有意义。
  • @stevieb:我不同意。你真的学会了如何一次正确地做每件事吗?如果是这样,那么你知道的比我多。
  • 至于我们对这类问题的反应:我们这里的大多数人都是长期使用 Perl 的专业程序员。如果有人问一个非常具体的问题,我们通常不会质疑原因,但在你的情况下,有很多背景故事听起来像是一个不好的方法。因此,我们建议替代方案并指出缺陷。这是为了鼓励人们学习更多,并以更安全或更现代的方式做事。
  • 您也确实要求最好的方法,它会征求意见,这是题外话。这里已经提到了三种可以回答这个问题的方法,我至少知道另外两种。不过,最好的方法恕我直言,不要这样做。

标签: perl cgi


【解决方案1】:

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

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

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

  • 向它发出 HTTP 请求(使用来自 LWP bundle of modules 的东西)。
  • 使用 CGI.pm 的调试机制以与当前调用它相同的方式调用它,但传递 CGI 参数,如 foo=xxx&amp;bar=yyy&amp;baz=zzz(有关详细信息,请参阅 DEBUGGING section of the CGI.pm documentation)。当然,这依赖于使用 CGI.pm 的程序,我觉得这有点 hacky。
  • 如果您使用system() 从另一个程序调用,请问自己该程序是否真的需要是CGI 程序。然后决定将其重写为命令行程序。如果您需要 CGI 版本和命令行版本,则可以将大部分代码移动到一个模块,该模块可由两个仅提取参数的瘦包装器使用。

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

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

更新:如果我不重申许多人在 cmets 中已经就您的原始问题所说的话,那我就失职了 - 这听起来是个糟糕的主意。

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2011-02-08
    • 2014-05-20
    • 2019-10-22
    • 2017-11-07
    相关资源
    最近更新 更多