Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> net::telnet не работает 
:(
    Опции темы
Suic2
Дата 8.10.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



Всем привет, есть скрипт, которые подключается к коммутаторам и заливает туда некоторые правила.
Код

#!/usr/bin/perl

use Net::Telnet;
use DBI;


my $d_s = 'DBI:mysql:bill:localhost';
my $dbh = DBI->connect($d_s, "логин", "пароль") 
or die "Can't connect to $d_s: $DBI::errstr";

$sql="SELECT id, ip FROM users";
$sth=$dbh->prepare($sql);
$sth->execute;
while ($p=$sth->fetchrow_hashref)
{
#бла-бла-бла
    if($sw_port&&$sw_ip)
    {
        $hash->{$sw_ip}->{$sw_port}=$ip;
    }
}
$pr='';
@keys1=keys(%$hash);
foreach $key1 (@keys1)
{
    $telnet_h=new Net::Telnet(Host => "$key1", Timeout => 30);
    $telnet_h->max_buffer_length(500000);
    ($prematch, $match)=$telnet_h->waitfor('/Username:.*$/i');
    $telnet_h->print("");
    ($prematch, $match)=$telnet_h->waitfor('/password:.*$/i');
    $telnet_h->print("");
    @keys2=keys(%{%$hash->{$key1}});
    foreach $key2 (@keys2)
    {
        $telnet_h->waitfor("/$pr/");
        $telnet_h->print("config access_profile profile_id 100 add access_id $key2 ip source_ip $hash->{$key1}->{$key2} port $key2 permit");
 # профиль №100 - разрешает для ip допуступ к порту $key2
        $telnet_h->waitfor("/$pr/");
        $telnet_h->print("config access_profile profile_id 101 add access_id $key2 ip source_ip 0.0.0.0 port $key2 deny");
 #профиль №101 - запрещает на порту $key2 любые другие ip
    }
    $telnet_h->close;
}


но при если пытаюсь запустить его из апача (require "/tmp/telnet.pl" или тупо дописать его же в скрипт админки биллинга), он ругается всякими ошибками
вот что пишет в httpd-error.log если подключать через require:
Код

[error] [client 172.16.0.3] pattern match timed-out at /tmp/telnet.pl line 56, referer: /путь
[error] [client 172.16.0.3] Compilation failed in require at /путь line 158., referer: /путь
[error] [client 172.16.0.3] Compilation failed in require at /путь line 389., referer: /путь
[error] [client 172.16.0.3] Premature end of script headers: adm.pl, referer: /путь


а вот что, если вписать код в сам скрипт:
Код

[error] [client 172.16.0.5] Invalid URI in request \x04\v\xf3l\x1b\xd5\x1d\x9b4\xbf\x823`
\x93\xf3;\xfe\xa3}X\x1d\xf7\x05\xce\xc2\xe0\xd8\xdf\xf9 \xc2h\xc3~\x7f\xcf\x8e7\xd3\xab6 
\xd5\xf2\xb4c\xcb\xff\x98*i>\xd6\x88Z\xf4p\xa2 \xb7\xa3\x7f\xcc
[error] [client 172.16.0.5] Invalid URI in request \x87]e\xe1\x07f\x05e~ \xee\x8d7\x01R 
\xfb9\x18\xf4\xd2\xe6T\x01\xa1\xde \xb4R&i\x9e\x85w\xbb
[error] [client 172.16.0.5] pattern match timed-out at /путь line 196, referer: /путь
[error] [client 172.16.0.5] Compilation failed in require at /путь line 389., referer: /путь
[error] [client 172.16.0.5] Premature end of script headers: adm.pl, referer: /путь


в чем может быть проблема? как исправить?

Это сообщение отредактировал(а) Suic2 - 8.10.2012, 12:00
PM MAIL   Вверх
alezzz
Дата 8.10.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 2
Всего: 14



Цитата(Suic2 @  8.10.2012,  11:59 Найти цитируемый пост)
error] [client 172.16.0.3] pattern match timed-out at /tmp/telnet.pl line 56, referer: /путь

что в строке 56? 
Цитата(Suic2 @  8.10.2012,  11:59 Найти цитируемый пост)
$pr='';

а дальше откуда берется $pr ?

PM MAIL   Вверх
Suic2
Дата 8.10.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



Там естественно $telnet_h->waitfor("/$pr/");  smile 
$pr ни откуда не берётся, пустая строка... Насколько я понял, там должно быть приветствие командной строки, но в каком виде так и не понял...
когда подключаюсь по телнету мне коммутатор выдаёт 

DES-1228/ME:5#
или
DES-3028:5#

гдето в дебрях интернета видел пример, там пустую $pr='' передают и всё работает:( и если запускать не через апач то тоже всё отлично

Это сообщение отредактировал(а) Suic2 - 8.10.2012, 12:34
PM MAIL   Вверх
alezzz
Дата 8.10.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 2
Всего: 14



Видимо недождалось вашего пустого $pr и вывалилось по таймауту. Запустите скрипт вручную, без апача. Посмотрите на каком именно свиче валится скрипт, что у вас еще есть кроме 1228 и 3028. 
У меня D-Link-и нормально работают с методами open, login, cmd, вот на цисках да, извращался с waitfor

Это сообщение отредактировал(а) alezzz - 8.10.2012, 12:44
PM MAIL   Вверх
Suic2
Дата 8.10.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



так если вручную запускаю он корректно завершается, залив всё что нужно на все коммутаторы. а можно пример с login и cmd? у меня уже после login вылетало
кроме 1228 и 3028 ничего больше нет

Это сообщение отредактировал(а) Suic2 - 8.10.2012, 12:45
PM MAIL   Вверх
alezzz
Дата 8.10.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 2
Всего: 14



Код

my $t = new Net::Telnet (
    Timeout => 10,
    Prompt => $params{'default_prompt'}
);

$t->open($host);
$t->login($params{'login'}, $params{'password'});

$t->cmd('disable clipaging');
$t->cmd(String=> 'en ad', Prompt=>$params{'admin_prompt'});
$t->cmd($params{'admin_password'});
my @lines = $t->cmd("show fdb port $port");
print @lines;

По названию переменных должно быть понятно что там, есдинственное $params{'default_prompt'} = '/DES-[\d-]+:.#/'

Добавлено через 3 минуты и 5 секунд
Цитата(Suic2 @  8.10.2012,  12:33 Найти цитируемый пост)
DES-1228/ME:5#

под это наверно стоит переписать регулярку
$params{'default_prompt'} = '/DES-[^:]+:.#/'
как-то так
PM MAIL   Вверх
Suic2
Дата 8.10.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



вы волшебник! оно работает, спасибо большое, с cmd и login всё намного проще и компактнее
проверял только на 1228 но думаю и с 3028 проблем не возникнет, в худшем случае регулярное выражение поменять
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.