2015-12-30 1 views
0

J'ai créé un perl telnet à plusieurs commutateurs. Mon code génère uniquement une sortie de fichier journal pour plusieurs commutateurs Cisco.Perl: journal séparé pour chaque périphérique et convertir IP à hostname à partir des noms de fichier journal

Que dois-je faire pour créer un fichier journal distinct pour chaque statut de périphérique (y compris l'échec telnet)? Et comment puis-je convertir IP à nom d'hôte à partir des noms de fichiers de journal?

Fichiers journaux de sortie souhaités un par un, nom_hôte1.log, nom_hôte2.log, nom_hôte3.log ...... et ainsi de suite.

Voici mon code:

#!/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); 

Répondre

1

Je n'ai pas de dispositifs telnet pour tester avec, mais cela devrait au moins vous obtenez la plupart du temps. Il utilise gethostbyaddr() de Socket pour essayer de résoudre l'adresse IP à un nom d'hôte (et retombe à l'aide de l'adresse IP comme nom d'hôte si le nom est introuvable). Il utilise également la forme appropriée à trois arguments open avec les poignées de fichier lexicales (par opposition aux poignées de bareword), et il ouvre un nouveau fichier journal pour l'écriture au format hostname.log pour chaque hôte trouvé dans le fichier d'entrée.

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

Maintenant, je peux créer un fichier journal séparé pour chaque statut de périphérique. Cependant, les fichiers journaux sont toujours indiqués par IP. Le programme arrête de fonctionner et ne passe pas automatiquement à l'appareil suivant lorsque la panne de telnet se produit, s'il vous plaît veuillez le conseiller? Merci beaucoup. –

+0

Eh bien, avez-vous un DNS inversé pour les adresses IP auxquelles vous vous connectez? Sinon, vous serez bloqué avec l'adresse IP. Pour autant que vous ne progressiez pas avec les erreurs, il serait utile que vous spécifiiez les erreurs que vous obtenez. En outre, avez-vous essayé de lire la documentation ou peut-être essayer un 'eval' où il échoue? – stevieb