Perl脚本到Telnet到多个IP并发送重新启动命令,并将确认打印到日志文件
我正在尝试编写一个Perl脚本(以前从未编写过) 基本上,此脚本用于连接到VoIP电话系统并重新启动设备。我想让它连接到每个站点设备,重新启动它,并打印设备确认正在重新启动或连接错误到日志文件。我不知道我在用Perl做什么,我甚至不知道到目前为止我所做的是不是完全正确。这正是我通过在谷歌/论坛上四处挖掘所能找到的 我希望脚本执行以下操作: 我想让Perl脚本远程登录到一个预设的IP地址列表 我想要一个它将连接到的IP的.txt列表(它们都使用相同的登录名/密码)。 或者是否可以在实际的Perl脚本中包含该列表,将来可以对其进行编辑以添加/删除IP 脚本telnet发出后,我希望它发送命令“立即重新启动”,然后将响应打印到日志文件中,以及它发送命令时连接到的IP(发出命令时的响应类似于“系统正在停机以立即重新启动”)。我希望它对连接到的每个IP都这样做,如果它无法连接,我希望它沿着“XXX.XXX.XXX.XXX无法连接”的行打印一个错误 所以日志看起来像这样:Perl脚本到Telnet到多个IP并发送重新启动命令,并将确认打印到日志文件,perl,telnet,Perl,Telnet,我正在尝试编写一个Perl脚本(以前从未编写过) 基本上,此脚本用于连接到VoIP电话系统并重新启动设备。我想让它连接到每个站点设备,重新启动它,并打印设备确认正在重新启动或连接错误到日志文件。我不知道我在用Perl做什么,我甚至不知道到目前为止我所做的是不是完全正确。这正是我通过在谷歌/论坛上四处挖掘所能找到的 我希望脚本执行以下操作: 我想让Perl脚本远程登录到一个预设的IP地址列表 我想要一个它将连接到的IP的.txt列表(它们都使用相同的登录名/密码)。 或者是否可以在实际的Perl脚
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);
任何帮助都将是惊人的。您在这些设备上启用了SSH吗?您需要正则表达式来匹配提示。如果你有
或什么东西
你可以用/$/
#!/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;
(第一行)200AE2登录:(第二行)系统密码:(第三行)#这是我远程登录其中一台设备时显示的三行。在此处输入用户名,然后输入密码。然后它进入#提示符,等待命令。这三个条目都需要编码到perl脚本中吗?我个人会使用
print()
和waitfor()
方法的组合。您可以在这里找到示例:login()
方法等待login
或username
并用您设置的用户名响应,然后等待password
并用密码响应。如果它对你有效,你不需要为登录编写任何其他代码。啊,明白了。我试着在一个站点上运行它,但它似乎没有重新启动设备。我不确定问题出在哪里,因为日志写的是“XXX.XXX.XXX.101系统将重新启动”。但当我检查设备时,它仍在运行。如果您成功登录,请尝试使用$telnet->print('reboot now')
而不是cmd
并查看它是否有效。
XXX.XXX.XXX.101
XXX.XXX.XXX.102
XXX.XXX.XXX.103
...