【问题标题】:Perl: Separate log for each device & convert IP to hostname from the log filenamesPerl:为每个设备分离日志并将 IP 从日志文件名转换为主机名
【发布时间】:2015-12-30 10:03:41
【问题描述】:

我创建了一个可以远程登录到多个交换机的 perl。我的代码只为多个 Cisco 交换机生成一个日志文件输出。

我应该如何为每个设备状态创建单独的日志文件(包括 telnet 故障)? 以及如何从日志文件名中将 IP 转换为主机名?

想要的输出日志文件一一对应,hostname1.log、hostname2.log、hostname3.log……以此类推。

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Cisco;

my $username="danny";
my $pass="1234";

open (OUTPUT, ">intstatus.log" );
open (IP, "ip.txt") or die $!;

for my $line (<IP>) {
chomp $line;
$line =~ s/\t+//;
print $line, "\n";
SWTELNET($line); # pass $line as the argument to SWTELNET
}
sub SWTELNET {

my $host = shift; # $host is set to the first argument passed in from the above loop
my $t = Net::Telnet::Cisco -> new (
Host => $host,
Prompt => '/(?m:^(?:[\w.\/]+\:)?[\w.-]+\s?(?:\(config[^\)]*\))?\s?[\$#>]\s?(?:\(enable\))?\s*$)/',
Timeout => 6,
Errmode => 'return',
) or die "connect failed: $!";

if ($t->login($username,$pass)) {
$t->autopage;
$t->always_waitfor_prompt;

my @supenv=$t->cmd("show ip int br");
my @output = ();
print OUTPUT "$host\n@supenv\n";
 }
}
close(IP);
close(OUTPUT);

【问题讨论】:

    标签: perl logging cisco logfile juniper-network-connect


    【解决方案1】:

    我没有任何 telnet 设备可供测试,但这至少可以帮助您完成大部分工作。它使用来自Socketgethostbyaddr() 尝试将IP 解析回主机名(如果找不到名称,则回退到使用IP 作为主机名)。它还使用带有词法文件句柄(与裸字句柄相反)的 open 的正确三参数形式,并为输入文件中找到的每个主机打开一个新的日志文件,以 hostname.log 格式写入。

    use warnings;
    use strict;
    
    use Net::Telnet::Cisco;
    use Socket;
    
    my $username="danny";
    my $pass="1234";
    
    open my $infile, '<', "ip.txt" or die $!;
    
    for my $ip (<$infile>) {
        chomp $ip;
        $ip =~ s/\t+//;
    
        # resolve IP to hostname if possible
    
        my $host = gethostbyaddr(inet_aton($ip), AF_INET);
    
        $host = $ip if ! $host;
    
        SWTELNET($host);
    }
    
    close $infile;
    
    sub SWTELNET {
    
        my $host = shift;
    
        my $t = Net::Telnet::Cisco->new(
            Host => $host,
            Prompt => '/(?m:^(?:[\w.\/]+\:)?[\w.-]+\s?(?:\(config[^\)]*\))?\s?[\$#>]\s?(?:\(enable\))?\s*$)/',
            Timeout => 6,
            Errmode => 'return',
        ) or die "connect failed: $!";
    
        if ($t->login($username,$pass)) {
            $t->autopage;
            $t->always_waitfor_prompt;
    
            my @supenv=$t->cmd("show ip int br");
    
            # no need to manually close the file after, as it'll happen
            # automatically as soon as the scope ends
    
            open my $wfh, '>', "$host.log";
            print $wfh "$host\n@supenv\n";
        }
    }
    

    【讨论】:

    • 现在我可以为每个设备状态创建单独的日志文件。但是,日志文件仍由 IP 指示。 telnet失败时程序停止运行,不会自动转到下一个设备,请指教?非常感谢。
    • 那么,您是否为要连接的 IP 地址设置了反向 DNS?如果没有,您将被 IP 卡住。至于没有出现错误,如果你指定你得到什么错误会有所帮助。另外,您是否尝试过阅读文档,或者尝试发送失败的eval
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2020-11-03
    相关资源
    最近更新 更多