需要帮助从Telnet获取输出到Perl中的数组

时间:2012-03-20 18:37:25

标签: arrays perl telnet

首先,我想为这样一个愚蠢的问题道歉,但我对脚本很新。

我正在尝试做什么: 在我的办公室,我正在尝试自动化出厂重置开关的能力。其开发人员的测试设备不是生产设备。我正在尝试将交换机的telnet提示符中的文件列表转储到数组中,然后通过它们进行过滤以保留我们的图像并删除其余部分。

交换机的常量和变量:此部分的切换提示符为&gt ;,文件都有和没有扩展名,文件夹输出为foo \

我的问题: sub没有正确发出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 :(得分:0)

根据以下讨论编辑的答案

问题确实是$t->put(chr(13));发送\r会导致交换机响应另一个=>提示,该提示现在位于输出中。当您发出cmd时,prompt会导致第一行输出停止读取。

empty_buffer将无效,因为在您调用cmd()之前,输入缓冲区中没有任何内容;它不是一个多线程应用程序。 cmd()正在写,然后阅读。这是从执行的套接字中读取的第一个。如果您在此时使用getline,那么您将拥有第一行,输入缓冲区将包含其余部分(或至少大部分内容取决于在库中读取套接字的方式)

如果不是使用cmd而是使用printput手动编写命令,而是使用循环和getline(),则可以忽略第一个=>如果你绝对无法消除发送\r

答案 1 :(得分:0)

您可能希望停止捕获回显的输入。查看Net :: Telnet文档中的cmd_remove_mode。