2016-02-05 75 views
2

我一直負責在Webmin中創建一個簡單的頁面和表單,它需要5個參數,並將它們發送到bash腳本以供進一步處理。如何將表單數據從cgi文件發佈到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

如果您發佈一個腳本,則參數是通過STDIN給出,從您的bash腳本內即你必須閱讀STDIN才能得到它們。也許這可能有所幫助:http:// stackoverflow。com/a/5451943/5830574 – PerlDuck

回答

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 
} 
+1

感謝您的HTML提示和最佳做法。我處於資源有限的環境中,所以我希望你有一個提示,或者走下一步,讓表單域數據進入mySync.sh文件?謝謝。 –

相關問題