Скрипт perl запуск в cgi-bin

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Скрипт perl запуск в cgi-bin

Непрочитанное сообщение Vlad5503 » 2017-07-04 6:57:23

Есть perl-скрипт который получает данные через апач. Вот так http://мой_сервер/cgi-bin/on.pl?K=0&T=1&I=200
Скрипт должен записать в файл эти параметры. Права сейчас у скрипта www:www 777.
Но вместо этого получаю в логе это:

Код: Выделить всё

[Mon Jul 03 17:41:09.241288 2017] [cgi:error] [pid 12281] [client 100.150.150.120:2723] AH01215: Undefined subroutine &main::param called at /usr/local/www/apache24/cgi-bin/on.pl line 15.: /usr/local/www/apache24/cgi-bin/on.pl
Сам скрипт:

Код: Выделить всё

#!/usr/local/bin/perl

print ("Content-type: text/html\n\n");

my $date = localtime;
my $log = "/usr/scripts/table/on.log";
my $key = param ('K');
my $kod = param ('T');
my $tab = param ('I');
my $IP = $ENV{'REMOTE_ADDR'};

.....

Строка 15 это - my $key = param ('K');

Этот скрипт работал на виртуалке. Версия перла там 5.20. Здесь стоит perl5.24.
Поискал различия получаемых переменных, но не увидел разницы.
Подскажите направление куда мне рыть...Уже все выходные потерял из-за переноса этого скрипта...( :-)

Отправлено спустя 1 час 44 минуты 29 секунд:
забыл написать, что пробуя исполнение в консоли шелла тоже получаю ошибку:

Код: Выделить всё

Undefined subroutine &main::param called at on.pl line 15.
Отправлено спустя 30 минут 20 секунд:
Проблема решена так:

Код: Выделить всё

>perl -e shell -MCPAN
>install CGI
>exit
После двух минут ожидания установки скрипт начал работать.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Скрипт perl запуск в cgi-bin

Непрочитанное сообщение Vlad5503 » 2017-08-30 11:09:59

Надо сделать проверку валидности ip, который приходит в переменной к скрипту на перле. В инете нашел вариант Дмитрия Рассанова:

Код: Выделить всё

if ( $ip =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
   && ($1 < 256 && $2 < 256  && $3 < 256  && $4 < 256 ) ) {
   # $ip – правильный IP адрес
} else { # $ip – неверный IP адрес}
Но этот вариант не работает у меня. Т.е. он пропускает такие адреса как 192.168.2.300 и подобные ошибки в любом октете.
Перл работает на базе Freebsd 10.3 и

Код: Выделить всё

# perl -v
This is perl 5, version 24, subversion 1 (v5.24.1)
Ну и сам скрипт:

Код: Выделить всё

#!/usr/local/bin/perl

#cgi-bin/on.pl?id=172.16.***.***
print ("Content-type: text/html\n\n");
use strict;
use CGI ':standard';
use Encode;

my $id = param ('id');
my $IP = $ENV{'REMOTE_ADDR'};

if ( $id =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
   && ($1 < 256 && $2 < 256  && $3 < 256  && $4 < 256 ) ) {
   print("$id – правильный IP адрес"."\n");
} else { print("$id – неверный IP адрес"."\n") }
Выдает "...правильный адрес"
Не подскажете, что я не так сделал.