如何从cgi文件将表单数据发布到bash脚本?

时间:2016-02-05 10:39:30

标签: bash perl post cgi webmin

我的任务是在Webmin中创建一个带有5个参数的简单页面和表单,并将它们发送到bash脚本以供进一步处理。

没什么好看的,但这对我来说是新的,我不确定如何完成这项任务。

我能够手动将参数传递给我的bash脚本,如

sh mySync.sh "1.2.3.4" "user" "password" "abc" "def"

他们相应的回声。

以下是我的文件:

的index.cgi

#!/usr/bin/perl

require 'mySync-lib.pl';
ui_print_header(undef, $text{'index_title'}, "", undef, 1, 1);

$conf = get_mySync_config();
print &text('index_root', $dir),"<p>\n";


print( "<div class='container'>" );
print( "<div class='row'>" );
print( "<h3>MySync</h3>" );
print( "<p>Use this utility to pass params to mySync.sh</p>" );
print( "<form class='form-horizontal' method='POST' action='mySync.sh'>" );

print( "<div class='form-group'>" );
print( "<label for='targetServer' class='col-xs-2 control-label'>Target Server</label>" );
print( "<div class='col-xs-7'>" );
print( "<input type='text' class='form-control' name='targetServer' id='targetServer' placeholder='Target Server'>" );
print( "</div>" );
print( "</div>" );

print( "<div class='form-group'>" );
print( "<label for='userName' class='col-xs-2 control-label'>User Name</label>" );
print( "<div class='col-xs-7'>" );
print( "<input type='text' class='form-control' name='userName' id='userName' placeholder='User Name'>" );
print( "</div>" );
print( "</div>" );

print( "<div class='form-group'>" );
print( "<label for='password' class='col-xs-2 control-label'>Password</label>" );
print( "<div class='col-xs-7'>" );
print( "<input type='password' class='form-control' name='password' id='password'>" );
print( "</div>" );
print( "</div>" );

print( "<div class='form-group'>" );
print( "<label for='srcScope' class='col-xs-2 control-label'>Source Scope</label>" );
print( "<div class='col-xs-7'>" );
print( "<input type='text' class='form-control' name='srcScope' id='srcScope'>" );
print( "</div>" );
print( "</div>" );

print( "<div class='form-group'>" );
print( "<label for='destScope' class='col-xs-2 control-label'>Destination Scope</label>" );
print( "<div class='col-xs-7'>" );
print( "<input type='text' class='form-control' name='destScope' id='destScope'>" );
print( "</div>" );
print( "</div>" );

print( "<div class='form-group'>" );
print( "<div class='col-xs-offset-2 col-xs-10'>" );
print( "<button type='submit' class='btn btn-default'>Send Data to mySync.sh</button>" );
print( "</div>" );
print( "</div>" );

print( "</form>" );
print( "</div>" );
print( "</div> <!- end of container ->" );


ui_print_footer("/", $text{'index'});

mySync.sh

#!/bin/bash

echo "BASH FIELD 1:    $1"
echo "BASH FIELD 2:    $2"
echo "BASH FIELD 3:    $3"
echo "BASH FIELD 4:    $4"
echo "BASH FIELD 5:    $5"

如果我错过了一个步骤,或者下一个合乎逻辑的步骤是什么,请告诉我。 谢谢!

1 个答案:

答案 0 :(得分:0)

2016年编写CGI计划似乎颇为倒退。我建议安装Plack并编写PSGI程序。

但我们假设你有充分的理由使用过时的技术。

您应始终使用以下命令启动Perl程序:

use strict;
use warnings;

这些会在您的代码中显示一些问题。例如,我看到你使用的是一个名为%text$text{'index_title'})的哈希,而没有在任何地方声明它 - 也许这种情况发生在mySync-lib.pl,我无从知晓。

如果您正在编写CGI程序,那么您应该使用CGI.pm来让您的生活更轻松。您可以使用param()函数访问传递给程序的参数。如果您使用的是Perl 5.22,则需要安装CGI.pm,因为它不再是标准安装的一部分。

对于每一行HTML,您都不需要单独的print()语句。 您可以使用“heredoc”一次打印整个批次。

print <<"END_HTML";
<div class='container'>
... lots more HTML
</div>
END_HTML

但最好的方法是将HTML页面移到外部文件中并使用templating system

我们不需要使用&来调用Perl函数超过二十年。请不要这样做。

更新:无需为您编写代码,程序可能如下所示:

#!/usr/bin/perl

use strict;
use warnings;
use CGI qw[header param];

if (param()) { # parameters have been passed from the form
  # Use param() to get the input parameters
  # Use backticks to run your shell script and collect the output
  # Display output to the users
} else {
  # Display the input form to the users
}