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自动登录