制作一个表格输出

制作一个表格输出

如果可以在 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有新的值。

相关内容