Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl脚本到Telnet到多个IP并发送重新启动命令,并将确认打印到日志文件_Perl_Telnet - Fatal编程技术网

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

Perl脚本到Telnet到多个IP并发送重新启动命令,并将确认打印到日志文件,perl,telnet,Perl,Telnet,我正在尝试编写一个Perl脚本(以前从未编写过) 基本上,此脚本用于连接到VoIP电话系统并重新启动设备。我想让它连接到每个站点设备,重新启动它,并打印设备确认正在重新启动或连接错误到日志文件。我不知道我在用Perl做什么,我甚至不知道到目前为止我所做的是不是完全正确。这正是我通过在谷歌/论坛上四处挖掘所能找到的 我希望脚本执行以下操作: 我想让Perl脚本远程登录到一个预设的IP地址列表 我想要一个它将连接到的IP的.txt列表(它们都使用相同的登录名/密码)。 或者是否可以在实际的Perl脚

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

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

我希望脚本执行以下操作:

我想让Perl脚本远程登录到一个预设的IP地址列表

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

脚本telnet发出后,我希望它发送命令“立即重新启动”,然后将响应打印到日志文件中,以及它发送命令时连接到的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);

任何帮助都将是惊人的。

您在这些设备上启用了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
...