Использование некоторой версии ожидаемого - приемлемый способ сделать это.Уже есть зрелая часть сценариев OSS для выполнения терминального взаимодействия с большинством сетевых устройств от большинства поставщиков.Та же проблема существует, но гораздо больше глаз смотрит на нее и обновляет вещи, когда поставщики меняют запросы.
Проверьте RANCID .
Вот краткий примерСценарий, который я написал на основе RANCID для сбора ACL, рассчитывает на ASA:
#!/usr/bin/perl
use strict;
use Getopt::Std;
my $usage = "Usage: gethitcnt.pl -c configfile -o outputdir\n\n";
my %opts;
getopts('hc:o:', \%opts);
my $login = sprintf "~%s\/bin\/clogin.in", $ENV{'HOME'};
my $loginrc = sprintf "~%s\/.cloginrc", $ENV{'HOME'};
my $cmdfile = sprintf "~%s\/cmd", $ENV('HOME');
my $date = getdate;
my ($config,$outdir);
unless (-e $login) {
die "Cannot find $login\n\n";
}
unless (-e $loginrc) {
die "Cannot find $loginrc\n\n";
}
if ($opts{h} or !$opts{c}) {
die $usage;
}
if ($opts{o}) {
$outdir = $opts{o};
} else {
$outdir = $ENV{'PWD'};
}
if (-e $opts{c}) {
$config = getconfig($opts{c});
} else {
die "Cannot open config file $opts{c}\n\n";
}
foreach my $firewall (keys %$config) {
foreach my $acl (@{$config->{$firewall}}) {
open (CMD,>$cmdfile);
print CMD "show access-list $acl\n";
print CMD "clear access-list $acl counters\n";
close (CMD);
my $command = ($login,"-x",$cmdfile,$firewall)
open (TMP,"$command |");
my $outfile = sprintf "%s\/%s-%s-%s.txt", $outdir, $firewall, $acl, $date;
open (OUTFILE,>$outfile);
foreach my $line (<TMP>) {
if ($line =~ /\s*(access-list.*\(hitcnt=\d+\))/) {
print OUTFILE "$1\n";
}
}
system ("rm",$cmdfile);
}
}
sub getconfig {
my $configfile = shift;
open(CONFIG,$configfile);
my $out;
foreach (<CONFIG>) {
chomp;
my @$elements = split(/,/);
my $host = shift(@$elements);
$out->{$host} = $elements;
}
close(CONFIG);
return($out);
}
sub getdate {
my @time = localtime;
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my $month = $abbr[$time[4]];
my $out = sprintf "%s-%d", $month, $time[3];
return($out);
}