2015-12-30 53 views
0

我創建了一個遠程連接到多個交換機的perl。我的代碼僅爲多個思科交換機生成一個日誌文件輸出。Perl:爲每個設備分別記錄日誌並將日誌文件名中的IP轉換爲主機名

我該如何爲每個設備狀態創建單獨的日誌文件(包括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\[email protected]\n"; 
} 
} 
close(IP); 
close(OUTPUT); 

回答

1

我沒有任何的telnet設備來進行測試,但至少應該讓你最方式。它使用Socket中的gethostbyaddr()嘗試將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\[email protected]\n"; 
    } 
} 
+0

現在我可以爲每個設備狀態創建單獨的日誌文件。但日誌文件仍由IP指示。程序停止運行,並且在telnet發生故障時不會自動進入下一個設備,請注意?非常感謝你。 –

+0

那麼,您是否爲您連接的IP地址設置了反向DNS?如果沒有,你會被困在IP中。只要沒有錯誤進展,如果你指定了什麼錯誤,它會有所幫助。另外,你有沒有嘗試閱讀文檔,或嘗試一個'eval',它失敗了? – stevieb

相關問題