Есть скриптик. Открывает сессию с сервером, отправляет команды, в ответ получает вывод данных команд, кое что парсит и получает количество строк.
perl ./test.pl all 192.168.0.1 23 001,002,003
состав команды зависит от количества последнего аргумента, в котором данные разделены запятой, каждый блок перед запятой - отдельная команда. в данном случае отправится 3 команды телнет серверу.
stat #001001000
stat #001002000
stat #001003000
Дело в том, что ответ от выполнения этих команда приходит не всегда целиком. иногда приходит только половина вывода от любой из команд. Не могу понять причину такого беспорядка :) Будьте добры, подскажите как это отъдебажить?
Смотрел лог перла, команды отправляются целиком, но вот получает иногда только половину, но не всегда. примерно 2 раза из 10 приходят битые ответы. Потерь до сервера нет. если реализовывать с помощью bash и netcat, то 100% верные ответы всегда приходят. Но данный вариант не подходит, необходимо именно Net::Perl.
Сам скрипт:
#!/usr/bin/perl
use Net::Telnet;
use Switch;
$type = $ARGV[0];
$ipats = $ARGV[1];
$port = $ARGV[2];
$stream = $ARGV[3];
@streams = split(',', $stream);
switch($type){
case "one" { $reg="one"; }
case "two" { $reg="two"; }
case "three" { $reg="three"; }
case "other" { $reg="one|two|three"; }
case "all" { $reg=".*"; }
}
$swi = new Net::Telnet (Host => $ipats ,Port => $port , Timeout => 20, Prompt => '/>$/');
foreach $str (@streams) {
chomp $str;
@output = $swi->cmd(String => 'stat #001'.$str.'000');
foreach $resultline (@output) {
if ($resultline =~ m/state=\"($reg)\"/ ) {
push @arr, $1;
#chomp $resultline;print $resultline." ".$str."\n";
}
}
}
print "". @arr."\n";
#print scalar(@arr);
$swi->close();