此脚本适用于具有-w
开关的localhost但不能没有。它在use strict
和use warning
处于活动状态时也有效。
的apache2 / error.log中:
没有开关(中止脚本):
(2)No such file or directory: exec of ... failed
我得到了开关:
Use of uninitialized value $email_flag in string ne ...
看起来很初我。
在实时网络服务器上都没有人工作。 Perl对我来说很新,但我知道一些BASH和PHP。
我运行Debian Lenny,Apache2,Perl 5.10。
#!/usr/bin/perl -w
$| = 1;
my $mailprog = '/usr/sbin/sendmail'; # where the mail program lives
my $to = "not\@for.you"; # where the mail is sent
my ($command,$email,@pairs,$buffer,$pair,$email_flag) ;
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
# Split the pair up into individual variables. #
my($name, $value) = split(/=/, $pair);
# Decode the form encoding on the name and value variables. #
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# If they try to include server side includes, erase them, so they
# aren't a security risk if the html gets returned. Another
# security hole plugged up.
$value =~ s/<!--(.|\n)*-->//g;
## print "Name of form element is $name with value of $value \n";
if ($name eq 'email') {
$email = $value;
}
if ($name eq 'command') {
$command = $value;
}
}
if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||
$email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/ ) {
$email_flag = "ERROR";
}
my $urlcommand = $command;
if ($command eq 'Subscribe') {
$command = "SUBSCRIBE rpc-news";
}
if ($command eq 'Unsubscribe') {
$command = "UNSUBSCRIBE rpc-news";
}
if ($command eq 'Suspend') {
$command = "SET rpc-news NOMAIL";
}
if ($command eq 'Resume') {
$command = "SET rpc-news MAIL";
}
my $getInfo = '';
print "Content-Type: text/html\n";
if ($email_flag ne "ERROR") {
open(MAIL,"|$mailprog -t");
print MAIL "To: $to\n";
print MAIL "From: $email\n";
print MAIL "Subject: [rpc-news] $command \n";
print MAIL "Reply-to: $email \n";
print MAIL "$command \n";
print MAIL "EXIT \n";
close (MAIL);
$getInfo = "?result=good";
}
if ($email_flag eq "ERROR") {
$getInfo = "?result=bad";
}
my $rootURL= $ENV{'SERVER_NAME'};
my $url = "http://${rootURL}/thank_you.html${getInfo}&action=${urlcommand}";
print "Location: $url\n\n";
答案 0 :(得分:7)
您是否在Windows计算机上创建脚本并将其上载到Linux服务器而不修复行结尾?如果没有-w开关,shebang行可能看起来像“#!/usr/bin/perl\r
”,因此系统会寻找名为“perl \ r \ n”的程序(或者行结束看起来)。使用-w开关,“#!/usr/bin/perl
”没有难以理解的行结尾。相反,它会被卡在-w不会导致失败的地方。
我认为有一个关于此的问题,但我现在似乎无法在文档中找到它。
更新:我在PerlMonks上找到了它,在一个非常古老的Q&amp; A主题中看起来似乎无关,直到你阅读了消息正文:Answer: How to get rid of premature end of script headers。是的,我知道,如果你只是浏览线程,你甚至不会停止那个。但这是帖子的文字:
如果你开发了这个脚本 Windows,它可能是脚本 file具有非UNIX行结尾。 (该 perl解释器可以处理它们,但是 shebang线被解释 贝壳,并不容忍 错误的行结尾。)如果是这样的话 问题,脚本可能会终止 在shebang有一个错误 线。
答案 1 :(得分:3)
Use of uninitialized value $email_flag in string ne ...
看起来很初我。
if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ || $email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/ ) { $email_flag = "ERROR"; }
$ email_flag仅在模式匹配时才会在此处初始化 - 否则它将保持未定义状态。您可以添加else
子句以确保无论如何都会初始化。
答案 2 :(得分:0)
我不会使用该代码,它不使用CGI.pm(或CGI :: Simple ...) 从“nms - 专家撰写的网络程序”中获取“TFMail - 改进形式邮件”
安装简单,编写得很好(它使用CGI ......)