最新消息:

Perl实现Telnet自动登录

Perl admin 5197浏览 0评论

1.先安装perl的Net::Telnet模块,安装方法Perl模块安装。假设以普通用户admin来telnet登录到一台Linux服务器并执行2个命令,最简单的实例代码如下:

#!/usr/bin/perl -w
use strict;
use Net::Telnet;

#登录信息
#注意,$prompt是登陆后的命令提示行,如果匹配不上,脚本将会timeout
my $password = '123456';
my $username = 'admin';
my $prompt   = '/[.+]$ $/';
my $host     = '192.168.0.1';
my $cmd1     = '/usr/bin/who';
my $cmd2     = '/bin/ls -l';

#连接并登录到服务器
my $conn = new Net::Telnet(
   Timeout=>60,
   Prompt=>$prompt,
);
$conn->open($host);
$conn->login($username,$password);

#分别执行$cmd1和$cmd2命令,并输出结果
my @output = $conn->cmd($cmd1);
print "Output:@output";
@output = $conn->cmd($cmd2);
print "Output:@output";

#断开连接
$conn->close;

其实,这个模块也可以以expect的模式来自动登录网络机器,但是和纯粹的expect脚本风格没什么区别了,个人不太喜欢这种风格。

2.有时候我们可能需要登陆Cisco这样的网络机器,分多个权限模式,上面的代码就不太适合了,使用expect风格的当然是没问题的,但是有更简单的方式,那就是使用Net::Telnet::CISCO模块,假设我们要在enable模式下显示Cisco交换机的0/1口状况,简单的实例代码如下:

#!/usr/bin/perl -w
use strict;
use Net::Telnet::Cisco;
 
#登录信息
my $host     = '192.168.0.100';
my $vtyPass  = 'vty123';
my $enaPass  = 'ena123';
my $cmd      = 'show interfaces fastEthernet 0/1 status';
 
#连接对象机器
my $conn = Net::Telnet::Cisco->new(Host => $host);
 
#vty密码
$conn->login(Password => $vtyPass);
 
#提升权限到enable模式
$conn->enable($enaPass);
 
#执行命令并显示结果
my @output = $conn->cmd($cmd);
print "Output:@output";
 
#断开连接
$conn->close;

3.虽然不喜欢expect风格,但是我还是用Net::Telnet模块以expect风格的模式实现一下上例中的登录Cisco机器。

#!/usr/bin/perl -w
use strict;
use Net::Telnet;
 
#登录信息
#注意,$prompt是登陆后的命令提示行,如果匹配不上,脚本将会timeout
#被我注释的那行$prompt,是Net::Telnet::Cisco里的规则,比较完善。
my $host     = '192.168.0.100';
my $vtyPass  = 'vty123';
my $enaPass  = 'ena123';
my $prompt   = '/.+[>#]$/';
#my $prompt   = '/(?m:^[w.-]+s?(?:(config[^)]*))?s?[$#>]s?(?:(enable))?s*$)/';
my $cmd      = 'show interfaces fastEthernet 0/1 status';
 
#连接并登录到服务器
my $conn = new Net::Telnet(
    Timeout => 60,
);
$conn->open($host);
 
#匹配输入vty密码的提示,并输入密码
$conn->waitfor('/password/i');
$conn->print($vtyPass);
 
#等待命令提示行然后提升到enable权限
$conn->waitfor($prompt);
$conn->print('ena');
#匹配输入enable密码的提示,并输入密码
$conn->waitfor('/password/i');
$conn->print($enaPass);
 
#执行命令并输出结果
$conn->waitfor($prompt);
$conn->print($cmd);
my @output = $conn->waitfor($prompt);
print "Output:@output";
 
#断开连接
$conn->close;

结语,本文只是提供了简单的代码,你应该根据你的实际情况完善代码。比如你需要对批量的机器进行同样的设置时,那么推荐你把进行连接设置的部分做成函数,然后循环调用,如果你还需要几乎同时进行设置,那么我还推荐你采用多进程的方式。如果你是新手不会这些编码,可以通过邮件联系我,我们共同探讨。
另外,关于Net::Telnet和Net::Telnet::Cisco的更详细用法,请执行perldoc Net::Telnet和perldoc Net::Telnet::Cisco查看帮助,或者去官方看相关文档资料。

转载请注明:爱开源 » Perl实现Telnet自动登录

您必须 登录 才能发表评论!