【问题标题】:Perl Script to Telnet to multiple IP and send a Reboot command, and print a confirmation to a log filePerl 脚本 Telnet 到多个 IP 并发送重启命令,并将确认打印到日志文件
【发布时间】:2013-09-26 22:49:39
【问题描述】:

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

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

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

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

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

一旦脚本远程登录,我希望它发送命令“立即重启”,然后将响应连同它在发送命令时连接到的 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);

任何帮助都会很棒。

【问题讨论】:

    标签: perl telnet


    【解决方案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
    ...
    

    【讨论】:

    • (First Line) 200AE2 Login: (Second Line) System Password: (Third Line) # 这些是当我远程登录到其中一个设备时显示的三行。我在哪里输入用户名,然后是密码。然后它转到# 提示符,等待命令。是否需要将所有这三个条目都编码到 perl 脚本中?
    • 我个人会使用print()waitfor() 方法的组合。您可以在此处找到示例:search.cpan.org/~jrogers/Net-Telnet-3.04/lib/Net/…
    • login() 方法等待loginusername 并以您设置的用户名响应,然后等待password 并以密码响应。如果它对您有用,则无需编写任何其他代码即可登录。
    • 啊,明白了。我尝试在一个站点上运行它,但它似乎没有重新启动设备。我不确定问题可能是什么,因为日志正在写入此“XXX.XXX.XXX.101 系统正在重启”。但是当我检查设备时,它仍在运行。
    • 如果您成功登录,请尝试使用$telnet-&gt;print('reboot now'); 而不是cmd,看看是否有效。
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2013-04-09
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多