Perl中一个关于Net::Telnet中的一问题

时间:2022-01-15 15:19:52
我现在在用perl做一个项目.在使用Perl登录对方服务器的时候,总是提示超时,我想着应该是提示符的问题,请高手们帮忙分析一下.
报错信息是:
timed-out waiting for login prompt at get_file.pl line 32

my $telnet =new Net::Telnet(Timeout =>60,
                                Prompt =>'/^\s+$/',
                                Port =>8000);
$telnet->open($ip);
$telnet->login($user_name,$password);
print "Telnet Successfully!\n" if(defined $telnet);


手功登录方式是:
HBapp2% telnet xxx.x.xxx.x 8000            #ip用xxx.x.xxx.x代替
Trying xxx.x.xxx.x...
Connected to xxx.x.xxx.x.
Escape character is '^]'.
guest                                      #用户名
123456                                     #密码

到这里登录算是完成了,在登录的过程没有任何提示符的.如果你再相应的命令,服务器会吐出大量信息的.
请大家帮忙看一下,我上面的代码错在哪里?

21 个解决方案

#1


你在设置了prompt后,在打开的时候,程序会一直等待命令行提示符,然而在此时并不会出现,因为你需要先输入用户名和密码,所以,提示你超时了。不要用这种方式,你可以使用等待一个通配符,然后就print回用户名,再print回密码。

#2


谢谢你的回复,但是还没明白你说的意思?最后献上代码瞧一下.

#3


use strict;
use warnings;
use Net::Telnet;

my $tnet=new Net::Telnet('Host'=>'127.0.0.1','Timeout'=>3,'Dump_Log'=>'test.log');
$tnet->waitfor('Match'=>"/login:/");#适当的时候……
$tnet->print("fibbery");            #输入适当的内容
$tnet->waitfor('Match'=>"/password:/");#适当的时候……
$tnet->print("mypassword");            #输入适当的内容
$tnet->waitfor('/\>/');#等待命令行提示符
my @lines=$tnet->cmd('String'=>"dir",'Prompt'=>'/fibbery\>/');#执行命令
$tnet->print("exit");
$tnet->close();
print("@lines\n");


D:\temp\Perl>perl test.pl
 驱动器 C 中的卷没有标签。
  卷的序列号是 2C08-EFB1

  C:\Documents and Settings\fibbery 的目录

 2010-03-26  21:46    <DIR>          .
 2010-03-26  21:46    <DIR>          ..
 2010-03-03  21:32    <DIR>          CMB
 2010-03-26  21:46    <DIR>          Favorites
 2010-03-26  19:25    <DIR>          My Documents
 2010-03-28  23:05    <DIR>          Tracing
 2009-12-14  22:46    <DIR>          「开始」菜单
 2010-04-05  13:15    <DIR>          桌面
                0 个文件              0 字节
                8 个目录  6,396,502,016 可用字节

 C:\Documents and Settings\

#4


我路过

#5


好东东~~~

#6


学习来了。

#7


学习。。。。。。。。。。。

#8


学习。。。。。。。。。。。

#9


学习来了。

#10


通过修改代码,登录服务已成功,但是发送命令时却仍会抛出超时异常。修改后的代码是:
my $t =new Net::Telnet(
                  Timeout =>10,
                  Port =>8000,
                  Dumper_Log =>"dumper_log.log",
                  Input_Log =>"input_log.log",
                  Output_Log =>"output_log.log"
                       );
$t->open($ip);
$t->print($user_name);
$t->print($password);
print "Login Server Successfully!\n" if(defined $t);
my @data =$t->cmd(String =>"$command1");
print "@data\n";

运行结果:
##############################
Login Server Successfully!
command timed-out at send_command.pl line 41
不过在产生的日志文件:input_log.log文件中却有命令结果。
请问:既然日志文件中有了命令结果,那就说明命令已经执行成功了,为什么还提示超时异常?
还有:我通过$t->print($command1);
程序不提示任何异常,但是没有任何输出。请高手们帮忙分析一下,多谢。

#11


use strict;
use warnings;
use Net::Telnet;

my $tnet=new Net::Telnet('Host'=>'127.0.0.1','Timeout'=>3,'Dump_Log'=>'test.log');
$tnet->waitfor('Match'=>"/login:/");
$tnet->print("fibbery");
$tnet->waitfor('Match'=>"/password:/");
$tnet->print("password");
$tnet->waitfor('/\>/');
$tnet->print("dir");
$tnet->errmode("return");
while(my $data=$tnet->get('Timeout'=>9999999))#设置一个合适的超时,不至于使程序没运行结束而终止等待
{
    print($data);
    if($data=~/fibbery\>/)#此处判断何时程序运行结束
    {
        last;
    }
}
$tnet->print("exit");
$tnet->close();

#12


学习学习

#13


学习来了。

#14


学习学习

#15


mark

#16


Perl中一个关于Net::Telnet中的一问题

#17


顶楼主  希望多发技术贴

#18


学学 不错

#19


太高深了,我也得好好学习呀!

#20


该回复于2010-04-13 20:41:07被版主删除

#21


可以 可以  多学习  

#1


你在设置了prompt后,在打开的时候,程序会一直等待命令行提示符,然而在此时并不会出现,因为你需要先输入用户名和密码,所以,提示你超时了。不要用这种方式,你可以使用等待一个通配符,然后就print回用户名,再print回密码。

#2


谢谢你的回复,但是还没明白你说的意思?最后献上代码瞧一下.

#3


use strict;
use warnings;
use Net::Telnet;

my $tnet=new Net::Telnet('Host'=>'127.0.0.1','Timeout'=>3,'Dump_Log'=>'test.log');
$tnet->waitfor('Match'=>"/login:/");#适当的时候……
$tnet->print("fibbery");            #输入适当的内容
$tnet->waitfor('Match'=>"/password:/");#适当的时候……
$tnet->print("mypassword");            #输入适当的内容
$tnet->waitfor('/\>/');#等待命令行提示符
my @lines=$tnet->cmd('String'=>"dir",'Prompt'=>'/fibbery\>/');#执行命令
$tnet->print("exit");
$tnet->close();
print("@lines\n");


D:\temp\Perl>perl test.pl
 驱动器 C 中的卷没有标签。
  卷的序列号是 2C08-EFB1

  C:\Documents and Settings\fibbery 的目录

 2010-03-26  21:46    <DIR>          .
 2010-03-26  21:46    <DIR>          ..
 2010-03-03  21:32    <DIR>          CMB
 2010-03-26  21:46    <DIR>          Favorites
 2010-03-26  19:25    <DIR>          My Documents
 2010-03-28  23:05    <DIR>          Tracing
 2009-12-14  22:46    <DIR>          「开始」菜单
 2010-04-05  13:15    <DIR>          桌面
                0 个文件              0 字节
                8 个目录  6,396,502,016 可用字节

 C:\Documents and Settings\

#4


我路过

#5


好东东~~~

#6


学习来了。

#7


学习。。。。。。。。。。。

#8


学习。。。。。。。。。。。

#9


学习来了。

#10


通过修改代码,登录服务已成功,但是发送命令时却仍会抛出超时异常。修改后的代码是:
my $t =new Net::Telnet(
                  Timeout =>10,
                  Port =>8000,
                  Dumper_Log =>"dumper_log.log",
                  Input_Log =>"input_log.log",
                  Output_Log =>"output_log.log"
                       );
$t->open($ip);
$t->print($user_name);
$t->print($password);
print "Login Server Successfully!\n" if(defined $t);
my @data =$t->cmd(String =>"$command1");
print "@data\n";

运行结果:
##############################
Login Server Successfully!
command timed-out at send_command.pl line 41
不过在产生的日志文件:input_log.log文件中却有命令结果。
请问:既然日志文件中有了命令结果,那就说明命令已经执行成功了,为什么还提示超时异常?
还有:我通过$t->print($command1);
程序不提示任何异常,但是没有任何输出。请高手们帮忙分析一下,多谢。

#11


use strict;
use warnings;
use Net::Telnet;

my $tnet=new Net::Telnet('Host'=>'127.0.0.1','Timeout'=>3,'Dump_Log'=>'test.log');
$tnet->waitfor('Match'=>"/login:/");
$tnet->print("fibbery");
$tnet->waitfor('Match'=>"/password:/");
$tnet->print("password");
$tnet->waitfor('/\>/');
$tnet->print("dir");
$tnet->errmode("return");
while(my $data=$tnet->get('Timeout'=>9999999))#设置一个合适的超时,不至于使程序没运行结束而终止等待
{
    print($data);
    if($data=~/fibbery\>/)#此处判断何时程序运行结束
    {
        last;
    }
}
$tnet->print("exit");
$tnet->close();

#12


学习学习

#13


学习来了。

#14


学习学习

#15


mark

#16


Perl中一个关于Net::Telnet中的一问题

#17


顶楼主  希望多发技术贴

#18


学学 不错

#19


太高深了,我也得好好学习呀!

#20


该回复于2010-04-13 20:41:07被版主删除

#21


可以 可以  多学习