Perl 스크립트에서 snmpwalk를 수행하고 index 및 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
먼저 질문을 재구성하세요.
각 IP/호스트에 대해 snmpwalk에서 데이터를 입력하고 각 OID에 대한 테이블을 출력하는 Perl 스크립트를 작성하는 방법.
둘째, 귀하의 예제 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/perlformPerl "형식" 및 관련 write
명령에 대한 추가 정보. $^L
페이지 구분 기호를 기존 페이지 팝 문자(CTRL-L) 대신 세 개의 개행 문자로 설정합니다 . 이 $- = 0;
비트는 기본적으로 다음에 "write"가 호출될 때 새 페이지(새 헤더 포함)를 강제로 생성합니다. 다음에 호출되면 새로운 값이 나타납니다 $hostname
.$ip