首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl、telnet和输出

Perl、telnet和输出
EN

Stack Overflow用户
提问于 2014-08-12 14:27:13
回答 2查看 3.7K关注 0票数 0

我很难找出为什么我的perl脚本没有适当地处理输出。

因此,代码(基于建议的更改更新的):

代码语言:javascript
复制
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时,出现了原始文本(和格式化文本),并显示我实际上正在执行命令并看到输出,然而,当我试图检查输出时,它会返回一个"":

代码语言:javascript
复制
Telnet to <targetIPAddress>
        Attempting telnet connection to <targetIPAddress>
        Client: <targetIPAddress> Command:  who
        Executing command: who
OUTPUT:

我只是不知道从这里该怎么办。我已经查看了Perl中Telnet上的几个堆栈溢出帖子,但在那里找不到多少帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-14 12:12:11

通过珀尔比丘,我发现了这个问题。详情如下:

id=1097296

在telnet语句的声明中,必须包括提示符,以便命令解释器知道命令的输出何时完成(通过regex运行)。

代码语言:javascript
复制
$telnet = Net::Telnet->new( Timeout=>5, Errmode=>'return', dump_log=>"dump_log.txt", input_log=>"input_log.txt");

需要成为:

代码语言:javascript
复制
$telnet = Net::Telnet->new( Timeout=>5, Errmode=>'return', dump_log=>"dump_log.txt", input_log=>"input_log.txt", prompt=>'/\>/');
票数 1
EN

Stack Overflow用户

发布于 2014-08-12 15:15:42

我只是不知道从这里该怎么办。

好吧,您错过了最明显的Perl问题解决技术。将以下两行添加到程序中。

代码语言:javascript
复制
use strict;
use warnings;

您会看到一些错误,说明您还没有声明变量。它们中的大多数都很简单,足以修复。但重要的是接近尾声。你有:

代码语言:javascript
复制
my @output = $telnet->cmd($listOfCommands[$j]);

然后以后:

代码语言:javascript
复制
print "$output\n"; 

和:

代码语言:javascript
复制
logging($targetHost, $output, "0");

@output是一个数组。$output是一个标量。它们是两个相互之间没有联系的不同变量。

还有一些其他的建议:

代码语言:javascript
复制
$telnet = new Net::Telnet (...);

最好写成:

代码语言:javascript
复制
$telnet = Net::Telnet->new(...);

我知道该模块的文档使用了以前的版本,但这是一个非常糟糕的想法,而且将来很有可能破坏一些东西。

另外,您的循环:

代码语言:javascript
复制
for(my $j=0; $j le scalar @listOfCommands; $j++)
{
    # stuff using $listOfCommands[$j]
}

最好写成:

代码语言:javascript
复制
foreach my $command (@listOfCommands)
{
    # stuff using $command
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25266884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档