Primeiro, refatorando sua pergunta:
How can I construct a perl script that inputs data from snmpwalk for each IP/Host and outputs a table for each OID.
Em segundo lugar, seus comandos de exemplo snmpwalk
não fazem sentido. Pode fazer sentido se OID
fosse uma variável. Você provavelmente quer usar
snmpwalk -v2 -c public $ {ip} $ {OID}
Você poderia fazer algo assim:
#!/usr/bin/env perl -w
# Invoke via $0 <ip-address-file> <OIDs ... >
$input_file=shift @ARGV;
$oids=join(" ",@ARGV);
$oids gt '' || die "Please provide at least one OID for snmpget to fetch"
format STDOUT_TOP =
@<<<<<<<<<<< @>>>>>>>>>>>>>>>>>>>
$ip,$hostname
.
format STDOUT =
@<<<<<<<<<<<<<<<<<<<<< @||||||||||||| @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
$oid,$type,$value
.
$^L="\n\n\n";
# parse inputfile
open(IPFILE,$input_file) or die "Cannot open $input_file";
while (my $host=<IPFILE>) {
chomp $host;
my ($hostname,$ip) = split(";",$host,2);
open(SNMP,"snmpget -v2 -cpublic $ip $oids |") or die "Cannot run snmpwalk"
print "$hostname => $ip :\n";
while ($_ = <SNMP>) {
if ( ($oid,$type,$value) = /^(.*?) = ([^:]+): (.*)$/ ) {
write
} else {
print STDERR "Could not parse this output:\n $_";
}
}
$- = 0;
}
snmpget
produzirá uma linha para cada OID. Consulte o link para obter mais informações sobre o "formato" Perl e o comando write
associado. O $^L
define o delimitador de página como três feeds de linha em vez do caractere de ejeção de página tradicional (que é CTRL-L). O bit $- = 0;
essencialmente força uma nova página (com um novo cabeçalho) na próxima vez que "write" é chamado. E na próxima vez que for chamado, $hostname
e $ip
terão novos valores.