首先,我想为这样一个愚蠢的问题道歉,但我对脚本很新。
我正在尝试做什么: 在我的办公室,我正在尝试自动化出厂重置开关的能力。其开发人员的测试设备不是生产设备。我正在尝试将交换机的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个或更多项目,则不会发出正确删除该文件夹中文件的命令。
任何想法都将不胜感激。谢谢! 谢谢!
答案 0 :(得分:0)
根据以下讨论编辑的答案
问题确实是$t->put(chr(13));
发送\r
会导致交换机响应另一个=>
提示,该提示现在位于输出中。当您发出cmd
时,prompt
会导致第一行输出停止读取。
empty_buffer
将无效,因为在您调用cmd()
之前,输入缓冲区中没有任何内容;它不是一个多线程应用程序。 cmd()
正在写,然后阅读。这是从执行的套接字中读取的第一个。如果您在此时使用getline
,那么您将拥有第一行,输入缓冲区将包含其余部分(或至少大部分内容取决于在库中读取套接字的方式)
如果不是使用cmd
而是使用print
或put
手动编写命令,而是使用循环和getline()
,则可以忽略第一个=>
如果你绝对无法消除发送\r
答案 1 :(得分:0)
您可能希望停止捕获回显的输入。查看Net :: Telnet文档中的cmd_remove_mode。