Perl-скрипт работает с ключом -w, но не без - PullRequest
0 голосов
/ 11 июня 2011

Этот скрипт работает на локальном хосте с переключателем -w, но не без него.Он также работает, когда 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";

Ответы [ 3 ]

7 голосов
/ 11 июня 2011

Вы создали свой скрипт на компьютере с Windows и загрузили его на сервер Linux, не исправляя окончания строк?Без ключа -w строка shebang может выглядеть как «#!/usr/bin/perl\r», поэтому система ищет программу с именем «perl \ r» (или, тем не менее, окончание строки выглядит).С ключом -w "#!/usr/bin/perl" не имеет неразборчивой строки, оканчивающейся на нем.Вместо этого он застревает в -w, где это не приводит к сбою.

Я думал, что по этому поводу был perlfaq, но сейчас я не могу найти его в документации.

Обновление: я нашел это на PerlMonks, в очень старой теме вопросов и ответов, которая кажется несвязанной, пока вы не прочитаете текст сообщения: Ответ: Как избавиться от преждевременного окончания заголовков скриптов .Да, я знаю, если бы вы просто просматривали темы, вы бы даже не остановились на этом.Но вот текст поста:

Если вы разработали этот скрипт в Windows, возможно, что файл скрипта имеет не-UNIX окончания строк.(Интерпретатор Perl может обработать их, но строка shebang интерпретируется оболочкой и не допускает неправильных окончаний строки.) Если это проблема, сценарий может завершиться с ошибкой прямо в строке shebang.

3 голосов
/ 11 июня 2011

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, чтобы обеспечить его инициализацию независимо от того, что.

0 голосов
/ 13 июня 2011

Я бы не использовал этот код, он не использует CGI.pm (или CGI :: Simple ...). Получите «TFMail - Улучшенная почта формы» из «nms - веб-программ, написанных экспертами»

Его просто установить и хорошо написано (он использует CGI ...)

...