我很难找出为什么我的perl脚本没有适当地处理输出。
因此,代码(基于建议的更改更新的):
sub telnet_connection{
my $targetHost = $_[0];
#my $uname = $_[1];
#my $pword = $_[2];
my @listOfCommands = @{$_[3]};
if($verbose){print "\t\tAttempting telnet connection to $targetHost\n"; }
eval{
$telnet = Net::Telnet->new( Timeout=>5, Errmode=>'return', dump_log=>"dump_log.txt", input_log=>"input_log.txt");
$telnet->open($targetHost);
$telnet->waitfor('/Username: $/i');
$telnet->print($username);
$telnet->waitfor('/PASSCODE: $/i');
$telnet->print($password);
$telnet->waitfor('/\>/');
#for(my $j=0; $j le scalar @listOfCommands; $j++)
for my $command (@listOfCommands)
{
if($verbose) { print "\t\tClient: " . $targetHost . " Command: $command\n"; }
if($verbose) { print "\t\tExecuting command: $command\n"; }
my @output = $telnet->cmd($command);
if($verbose)
{
print "OUTPUT:\n";
print "@output\n";
}
logging($targetHost, \@output, "0");
}
$telnet->close();
};
if($telnet->errmsg)
{
logging($targetHost,$telnet->errmsg,"1");
print $@;
}
}这是我编写的一个方法,它接受四个参数,telnet连接的目标、用户名、密码和一个命令数组。现在,我只是使用全局用户名和密码(分别为$username $password ),因为其他东西有问题。$verbose是我传递的一个标志,在本例中,它被设置为true。日志记录是我为相应地处理输出而编写的另一种方法,但是如果$verbose为true,我应该在控制台上看到它。代码能够进行身份验证,并运行命令,但我的输出没有出现。当我检查dump_log和input_log时,出现了原始文本(和格式化文本),并显示我实际上正在执行命令并看到输出,然而,当我试图检查输出时,它会返回一个"":
Telnet to <targetIPAddress>
Attempting telnet connection to <targetIPAddress>
Client: <targetIPAddress> Command: who
Executing command: who
OUTPUT:我只是不知道从这里该怎么办。我已经查看了Perl中Telnet上的几个堆栈溢出帖子,但在那里找不到多少帮助。
发布于 2014-08-14 12:12:11
通过珀尔比丘,我发现了这个问题。详情如下:
id=1097296
在telnet语句的声明中,必须包括提示符,以便命令解释器知道命令的输出何时完成(通过regex运行)。
$telnet = Net::Telnet->new( Timeout=>5, Errmode=>'return', dump_log=>"dump_log.txt", input_log=>"input_log.txt");需要成为:
$telnet = Net::Telnet->new( Timeout=>5, Errmode=>'return', dump_log=>"dump_log.txt", input_log=>"input_log.txt", prompt=>'/\>/');发布于 2014-08-12 15:15:42
我只是不知道从这里该怎么办。
好吧,您错过了最明显的Perl问题解决技术。将以下两行添加到程序中。
use strict;
use warnings;您会看到一些错误,说明您还没有声明变量。它们中的大多数都很简单,足以修复。但重要的是接近尾声。你有:
my @output = $telnet->cmd($listOfCommands[$j]);然后以后:
print "$output\n"; 和:
logging($targetHost, $output, "0");@output是一个数组。$output是一个标量。它们是两个相互之间没有联系的不同变量。
还有一些其他的建议:
$telnet = new Net::Telnet (...);最好写成:
$telnet = Net::Telnet->new(...);我知道该模块的文档使用了以前的版本,但这是一个非常糟糕的想法,而且将来很有可能破坏一些东西。
另外,您的循环:
for(my $j=0; $j le scalar @listOfCommands; $j++)
{
# stuff using $listOfCommands[$j]
}最好写成:
foreach my $command (@listOfCommands)
{
# stuff using $command
}https://stackoverflow.com/questions/25266884
复制相似问题