telnet自动化脚本有时会失败

时间:2012-09-26 06:45:23

标签: linux perl sockets telnet tcpdump

我正在运行以下简单的telnet脚本,该脚本只需登录到计算机并退出。

同一个脚本在一台Linux服务器上工作正常(经过1000次迭代)但从另一台Linux服务器上失败(一致)(200次尝试后失败)。

在失败的情况下,失败所需的迭代次数会有所不同,但失败是持久的。

#!/usr/bin/perl
use Net::Telnet;

my $loop = 0;
my $dumpfile = "dump.log";
my $inputfile = "input.log";

for ($loop =1; $loop <=1000; $loop++) {
        print "===============Loop: $loop =====================\n";
        $telnet = new Net::Telnet ( Timeout=>20, Errmode=>'die');
        print "$telnet\n";
        $telnet->open('sys-007');
        $telnet->dump_log($dumpfile);
        $telnet->input_log($inputfile);
        $telnet->waitfor('/login: $/i');
        $telnet->print('root');
        $telnet->waitfor('/Password:$/i');
        $telnet->print('007');
        sleep 2;
        $telnet->print('exit');
        print "=================================================\n";
}

脚本退出:

pattern match read eof at ./telnettest.pl line 15 (i.e, waitfor('/login: $/i'); Line)

我尝试了以下内容以查看出现了什么问题:

  1. 在客户端机器中:(sys-007)

    tcpdump -nvvv -w test.txt host <Server IP>
    
  2. 字符串test.txt有:

    成功尝试日志:

    sys-007 (ttyp0)
    ^Fl$4
    ^!^Fl$
    login: 
    ^Fl$4
    ^Fl$4
    root
    ^(^Fl*
    root
    bP"u
    ^Fl*4
    bP5u
    ^.^Fl*
    Password:
    ^Fl*4
    ^Fl*4
    007
    ^7^Fl6
    ^Fl64
    ^9^Fl6
    Terminal type? [xterm] 
    ^Fl64
    ^Fl64
    exit
    ^Fl<4
    ^Fl<
    exit
    ^Fl<
    

    尝试失败:

    sys-007 (ttyp0)
    *^hn
    +^hn
    

    没有登录:提示!

    1. 在服务器机器中:( Linux服务器)

      [telnet@server]~% netstat --inet -a | grep telnet | grep sys-007
      
      There are no TIME_WAIT or CLOSE_WAIT sockets.
      
    2. 请告诉我应该找些什么来找出问题所在。

2 个答案:

答案 0 :(得分:0)

此后你能正常登录吗?我猜这个其他服务器正在切断你,因为你已经建立了太多的连接。

答案 1 :(得分:0)

我怀疑telnet程序正在等待提示。我通常使用以下格式来定义提示,以便脚本通常能够从下面给出的选项中找到提示。

test  = new Net::Telnet (Timeout => 3000 , Prompt => '/[%#\$>?:] $/' );
$test->open($IPAddress1);
$test->login($Login,$Password1);
my @input=$test->cmd("uname -a\n");
print "Connected to : @input";
@input=$cmd->cmd("pwd\n");

如果您仍然遇到问题,请告诉我们。