Perl: отдельный журнал для каждого устройства и преобразование IP в имя хоста из имен файлов журнала
Я создал Perl, который Telnet для нескольких коммутаторов. Мой код генерирует только один вывод файла журнала для нескольких коммутаторов 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);
1 ответ
У меня нет устройств telnet для тестирования, но это, по крайней мере, поможет вам в этом. Оно использует gethostbyaddr()
из Socket, чтобы попытаться разрешить 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";
}
}