我的任务是在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"
如果我错过了一个步骤,或者下一个合乎逻辑的步骤是什么,请告诉我。 谢谢!
答案 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
}