Нужна помощь в получении вывода из Telnet в массив в Perl - PullRequest
0 голосов
/ 20 марта 2012

Сначала я хочу извиниться за такой глупый вопрос, но я довольно новичок в написании сценариев.

Что я пытаюсь сделать: В моем офисе я пытаюсь автоматизировать возможность возврата к заводским настройкам. Свое испытательное оборудование для разработчиков, а не производственное оборудование FYI. Я пытаюсь вывести список файлов из командной строки telnet коммутатора в массив, а затем отфильтровать их, чтобы сохранить наши изображения и удалить остальные.

Константы и переменные коммутатора: приглашение коммутатора для этого раздела =>, файлы имеют и не имеют расширений, папки выводятся как foo \

Мой вопрос: Подпрограмма неправильно выполняет команду rm, она работает в тесте (вывод значения), но не в самом сценарии удаления.

Новое обновление:

Я знаю, похоже, что я отказался от этого вопроса, но я этого не сделал! Я мучился с этой проблемой в течение последнего месяца, и я добился большого успеха. Я был в состоянии получить свои данные в мой первоначальный массив (да, у меня есть 2, об этом чуть позже). Он обработает массив и удалит содержимое, кроме тех, которые я хочу сохранить.

#!/usr/bin/perl

$| = 1;

use Net::Telnet;
use strict;
use CGI;
use warnings;

my $junk;
my $telnet;
my @array;

#establish connection
$telnet = new Net::Telnet (Timeout=> 10,
                           Errmode=> 'return',
                           Port   => '2037');

$telnet->open('trn-13-mrv-con-07');
$telnet->put(chr(13));

#clear out buffered output for array to grab
$junk = $telnet->cmd(string => 'ls', prompt => '/=>/');
#array grabbing
@array = $telnet->cmd(string => 'ls', prompt => '/=>/');

#determining what the values are of the array
foreach my $item (@array) {
   #removing the carriage return
   chomp ($item);
   #if it's a folder, this will shunt the to the sub
   if ($item=~ /\//) {
       subfolders ($item);
       $telnet -> print("rm $item");
   }
   #checks to see if the file is the firmware for the switch
   elsif ($item =~ /btm.swi|secondary.swi/) {
   }
   #deletes the rest
   else {
    $telnet -> print ("rm $item");
    $telnet->put(chr(13));
   }
}

sub subfolders {
 my @subfolder_contents;
 my $subfolder = $_[0];
 my ($file, $sub_junk);

 #attempting to clear out the array
 undef @subfolder_contents;
 #again grabing any cached output so array can do it's work
 $sub_junk = $telnet ->cmd(string => "ls $subfolder", prompt => '/=>/');
 #grabbing files from the folder
 @subfolder_contents = $telnet ->cmd(string => "ls $subfolder", prompt => '/=>/');

 #deleting all files in the subfolder
 foreach $file (@subfolder_contents){
  chomp ($file);
    $telnet-> print ("rm $subfolder$file");
    $telnet->put(chr(13));

 }
};

exit;

Это все прекрасно работает, И это будет работать и для папок, в основном ... Это работает с папками, если папка пуста или в ней есть только один элемент. Если в папке 2 или более элементов, он не выдает команду для правильного удаления файлов в этой папке.

Любые мысли приветствуются. Спасибо! Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Вы, вероятно, хотите прекратить захват эхосигнала. Посмотрите на cmd_remove_mode в документации Net :: Telnet.

0 голосов
/ 20 марта 2012

Ответ отредактирован из-за обсуждения ниже

Проблема действительно в $t->put(chr(13)); Отправка \r заставляет коммутатор ответить другим приглашением =>, которое сейчас находится ввыход.Когда вы запускаете cmd, prompt приводит к тому, что первая строка вывода останавливает чтение.

empty_buffer не будет работать, потому что во входном буфере ничего нет, пока вы не вызовете cmd();это не многопоточное приложение.cmd() пишет, затем читает.Это первое чтение из сокета, которое выполняется.Если бы вы использовали getline вместо этого, в этой точке у вас была бы первая строка, а входной буфер содержал бы остальную часть (или, по крайней мере, большую ее часть в зависимости от того, как выполняется чтение сокета в библиотеке)

Если вместо использования cmd вы написали команду вручную, используя print или put, затем использовали цикл и getline(), вы могли бы проигнорировать первый =>, если вы абсолютно не можете отменить отправку этого \r

...