如果可以在 perl 脚本中执行 snmpwalk 并将输出放入表中以进行某种关联,就像我在同一行中的每个主机名一样,如果索引和 desc 我在 bash 中有脚本,但我有输出没有提供我想要的关联,所以我需要你的帮助
#!/bin/bash
Rep_Scripts='/home/scripts'
out_file='/home/scripts/out_file'
rm -rf $Rep_Scripts/out_file
for i in `cat $Rep_Scripts/IP_ALU_LIST.txt | awk '{print}'`
do
read hostname ip <<< $(echo $i |sed 's/;/ /')
echo "${hostname} ==> ${ip} If_Name" >> out_file
snmpwalk -v2c -c ${ip} OID>> out_file
echo "${hostname} ==> ${ip} Global_If_Index" >> out_file
snmpwalk -v2c -c ${ip} OID >> out_file
echo "${hostname} ==> ${ip} If_Statut" >> out_file
snmpwalk -v2c -c ${ip} OID >> out_file
done
我在 IP_ALU_LIST.txt 中有
router2;89.100.12.100
router3;100.100.100.100
答案1
首先,重构你的问题:
如何构建一个 perl 脚本,为每个 IP/主机输入来自 snmpwalk 的数据并为每个 OID 输出一个表。
其次,您的示例snmpwalk
命令毫无意义。如果OID
是一个变量,这可能是有意义的。您可能打算使用 snmpwalk -v2 -c public ${ip} ${OID}
你可以这样做:
#!/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
将为每个 OID 输出一行。看http://linux.die.net/man/1/perlform有关 Perl“格式”和相关write
命令的更多信息。将$^L
页面分隔符设置为三个换行符,而不是传统的页面弹出字符(CTRL-L)。该$- = 0;
位实质上会在下次调用“write”时强制创建一个新页面(带有新的标头)。下次调用它时,$hostname
将会$ip
有新的值。