【发布时间】:2012-10-23 16:06:30
【问题描述】:
我有一个在 Windows 机器上运行的 xampp 测试系统设置。
我有一个小型命令行应用程序,我想使用 Perl CGI 脚本。
我有一个使用 Perl 创建的表单。有许多复选框以及一个输入框,用户可以在其中键入消息。
这是我到目前为止的代码。无论如何,我都不是 perl 专家,所以有 这里可能有一些没有意义的东西,或者用于测试目的
#!"C:\xampp\perl\bin\perl.exe"
#print a standard 200 -level HTTP header
print "Content-Type:text/html\n\n";
print "<html><head><title>Broadcast Message</title></head>\n";
print "<body>\n";
#display form data
#&displayInfo();
print "</body></html>\n";
if ($ENV{REQUEST_METHOD} eq "GET")
{
&formDisplay();
exit;
}
#Else process and display back to screen
else
{
#&switches();
&parseform();
&displayInfo();
exit;
}
#This subroutine will display information without using the HTML document
sub formDisplay
{
print qq~
<FORM METHOD="POST" ACTION="/cgi-bin/broadcast.cgi">
<h3>Broadcast Message to Domain</h3>
***PLEASE NOTE*** This will broadcast a message to ALL machines in the Domain</br></br>
<TABLE cellpadding=0 cellspacing=1 border=0>
<TR>
<TD>Select your target by switch:             </br></TD>
<TD></TD>
<TD>Select your target by department: </br></TD>
</TR>
<TR>
<TD><input type=CHECKBOX name=517 value="517"> - 517 </br></TD>
<TD></TD>
<TD><input type=CHECKBOX name=ACC value="ACC"> - ACC </br></TD>
</TR>
<TR>
<TD><input type=CHECKBOX name=testfiletxt value="testfiletxt"> - testefiletxt </br></TD>
</TR>
</TABLE>
</br></br>
Please type the message you wish to broadcast to the Domain: </br>
<input name="message"></br>
<input type=SUBMIT name=Send value="Send">
<input type=RESET name=Reset value="Reset">
</form>
~;
}
#This subroutine will display information received from a form
sub displayInfo {
print "<b>Your Message:</b> </br> ", $form{"message"}, "</br>";
$system_message=$form{"message"};
#system "sent.exe /u:testmachine \"$system_message\"" ;
print qq~
<form>
<input type="button" value="Back" onclick="history.go(-1);return true;">
</form>
~;
# Working loop for form hash
delete $form{'Send'};
foreach(keys %form) {
print "$form{$_} </br>";
}
##############################
$textme=$form{"testfiletxt"};
open( FILE, "< $textme" ) or die "Can't open $filename : $!";
while( <FILE> ) {
chomp;
print "sent.exe $_ ", $form{"message"} , "</BR>";
}
close FILE;
}
sub parseform
{
#get data from environment variable
read STDIN,$qstring,$ENV{"CONTENT_LENGTH"};
#$qstring = $ENV{'QUERY_STRING'};
#break data up on ampersands, and store in array
@pairs = split(/&/, $qstring);
#start a loop to process form data
foreach (@pairs) {
#split field name and value on "=", store in two scalar variables
($key, $value) = split(/=/);
#translate '+' signs back to spaces
$value =~ tr/+/ /;
#translate special characters
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#store data in hash
$form{$key} = $value;
}
}
我遇到的问题是处理已选中的文本框。
我需要脚本做的是使用用户指定的参数(即复选框和输入框)运行命令行实用程序。
我认为这将如何工作如下:
我们已经预先构建了文本文件,其中将包含我们网络中的计算机Netbios names,每行一个计算机名称。这些文件将代表交换机,每个交换机文件将包含连接到它的计算机的 Netbios 名称。我们最终也会将其扩展到做小组。
用户将转到此广播页面并选择他们希望广播到的交换机。因此,任何连接到特定交换机的机器都将收到此广播消息。用户还将提供要广播的消息。
-
当用户点击“提交”时,有一些事情需要发生。
- 需要打开代表所选交换机的文件,并且需要将用户输入的消息附加到列表中每个 Netbios 名称的末尾。示例:
用户提供的netbiosName消息
-
然后,一旦完成。命令行实用程序需要使用我们刚刚编辑的以下格式的文件运行:
sent.exe /t:15 /f:$filename
因此,如果用户选择了 3 个开关,则该命令应运行 3 次
sent.exe /t:15 /f:swtich1 sent.exe /t:15 /f:switch2 sent.exe /t:15 /f:switch3
我应该指出,/f" 选项告诉sent.exe 命令使用需要以特定方式格式化的文件。
我在一次处理一个选项方面取得了一些成功。
但我不知道当用户选择多个复选框时会发生什么。
如何使用循环轻松处理选中的复选框?
我可以从&parseform 子例程中提取它吗?还是有更简单的方法?
【问题讨论】:
-
如果用户选择多个部门,您是问如何处理数据?
-
首先,不要像那样手动解析表单数据。使用
CGI.pm或CGI::Simple。其次,将 HTML 与代码分开。第三,也是最重要的一点,您将允许任何可以查看该网页的人调用您机器上的另一个程序。首先阅读 CGI 安全常见问题解答:w3.org/Security/faq/wwwsf4.html -
是的 Andrey,我需要根据用户选择来处理数据。
-
思南,我以前没听说过cgi.pm。谢谢你的建议!我将不得不尝试找到一些将 HTML 与代码分开的示例。当我第一次学习 perl 时,我被展示了如何将两者混合在一起。我将不得不改掉坏习惯!至于安全性,这是我一直关心的问题。我想让页面启动并运行。一旦我知道我可以让它工作,我将保护网站。它将仅在我们的本地网络上使用,并且需要身份验证和任何其他有助于确保安全的安全措施。感谢您的帮助!
标签: perl command-line checkbox cgi