Perl脚本Telnet到多个IP并发送重新启动命令,并将确认打印到日志文件

时间:2013-09-21 17:36:40

标签: perl telnet

我正在尝试编写一个Perl脚本(以前从未这样做过)。

这个脚本基本上是连接到VoIP电话系统并重启设备。我希望它连接到每个站点设备,重新启动它并打印设备确认正在进行重新启动或连接错误到日志文件。我不知道我在使用Perl做什么,我甚至不知道到目前为止我的内容是否正确。这正是我通过在谷歌/论坛上挖掘所能找到的。

我希望脚本执行的操作如下:

我希望Perl脚本能够Telnet到预设的IP地址列表。

我想要一个它将连接到的IP的.txt列表(它们都使用相同的登录名/密码)。 或者是否可以将列表包含在实际的Perl脚本中,以后可以编辑以添加/删除IP?

一旦脚本telnet,我希望它发送命令'reboot now'然后将响应打印到日志文件以及它在发送命令时连接的IP(命令时的响应)发布的内容类似于“系统现在正在重新启动”。我希望它为它连接的每个IP执行此操作,如果它无法连接,我希望它按照'XXX.XXX.XXX.XXX无法连接'的方式打印错误

所以日志看起来像这样:

XXX.XXX.XXX.101 System going down for reboot
XXX.XXX.XXX.102 System going down for reboot
XXX.XXX.XXX.103 Unable to Connect
XXX.XXX.XXX.104 Unable to Connect
XXX.XXX.XXX.105 System going down for reboot

这可能吗?

我目前有这个:

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

my $log = './log.txt';

$telnet = new Net::Telnet ( Timeout=>10,
Errmode=>'die'
Prompt => '/\$ $/i');
$telnet->open('IPADDRESS');
$telnet->login('USERNAME', 'PASSWORD');
print $telnet->cmd('reboot now');
writef($log);

对于提示=>我需要更改它以匹配telnet和连接到IP时显示的符号吗?我看到的符号是#所以命令是:

Promt => '/\# #/i);

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

您是否在这些设备上启用了SSH?您需要正则表达式来匹配提示。如果您有#something#,则可以使用/# $/

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

my $log = './log.txt';

open LOG, ">>$log";         #open log file - append mode
open IPS, "<ip.list";       #open ip.list file - read mode
while(<IPS>){
 my $ip = $_;               #current iteration (line) of IPs file
 $telnet = new Net::Telnet ( Timeout=>10,
         Errmode=>'die'
         Prompt => '/# $/i');
 $telnet->open($ip);
 $telnet->login('USERNAME', 'PASSWORD');
 if($telnet->cmd('reboot now')){
  print LOG "$ip System going for reboot";
 }else{
  print LOG "$ip Unable to Connect";
 }
}
close LOG;                  #close files
close IPS;

ip.list只是IP列表,每行一个。

XXX.XXX.XXX.101
XXX.XXX.XXX.102
XXX.XXX.XXX.103
...