Как отправить данные формы в скрипт bash из файла cgi?
Мне было поручено создать простую страницу и форму в Webmin, которая принимает 5 параметров и отправляет их в скрипт 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 ответ
Написание программы CGI в 2016 году выглядит довольно задом наперед. Я бы рекомендовал установить Plack и написать программу PSGI.
Но давайте предположим, что у вас есть веские причины для использования устаревших технологий.
Вы всегда должны запускать программу Perl с:
use strict;
use warnings;
Это покажет некоторые проблемы в вашем коде. Например, я вижу, что вы используете хеш с именем %text
($text{'index_title'}
), нигде не объявляя - возможно, это происходит в mySync-lib.pl
У меня нет возможности узнать.
Если вы пишете CGI-программу, вам действительно следует использовать CGI.pm, чтобы сделать вашу жизнь проще. Вы можете получить доступ к параметрам, передаваемым в вашу программу, используя param()
функция. Если вы используете Perl 5.22, вам нужно установить CGI.pm, поскольку он больше не является частью стандартной установки.
Вам не нужно, чтобы человек print()
заявление для каждой строки HTML. Вы можете распечатать всю партию за один раз с "heredoc".
print <<"END_HTML";
<div class='container'>
... lots more HTML
</div>
END_HTML
Но лучшим подходом было бы переместить ваши HTML-страницы во внешние файлы и использовать систему шаблонов.
Нам не нужно было использовать &
вызывать функции 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
}