0

我正在尝试通过 SNMP 从 QLogic 交换机获取数据。当我从命令行 snmpwalk connUnitPortStatCountError OID (.1.3.6.1.3.94.4.5.1.3) 时,我得到交换机上每个端口的十六进制字符串结果:

# snmpwalk -v1 -On -c <community> <host> .1.3.6.1.3.94.4.5.1.3
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.1 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.2 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.3 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.4 = Hex-STRING: 00 00 00 00 00 00 00 01 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.5 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.6 = Hex-STRING: 00 00 00 00 00 00 00 2C 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.7 = Hex-STRING: 00 00 00 00 00 00 00 0E 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.8 = Hex-STRING: 00 00 00 00 00 00 00 09 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.9 = Hex-STRING: 00 00 00 00 00 00 00 38 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.10 = Hex-STRING: 00 00 00 00 00 00 00 1C 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.11 = Hex-STRING: 00 00 00 00 00 00 00 12 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.12 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.13 = Hex-STRING: 00 00 00 00 00 00 00 0A 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.14 = Hex-STRING: 00 00 00 00 00 00 00 21 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.15 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.16 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.17 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.18 = Hex-STRING: 00 00 00 00 00 00 00 04 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.19 = Hex-STRING: 00 00 00 00 00 00 00 08 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.20 = Hex-STRING: 00 00 00 00 00 00 00 0A 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.21 = Hex-STRING: 00 00 00 00 00 00 00 00 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.22 = Hex-STRING: 00 00 00 00 00 00 00 00 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.23 = Hex-STRING: 00 00 00 00 00 00 00 00 
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.24 = Hex-STRING: 00 00 00 00 00 00 00 00

但是当我在具有相同 OID 的 Perl 脚本中调用 Net::SNMP 的 get_table() 子例程时,某些端口的值与我从 snmpwalk 得到的结果不匹配:

# ./foo <host>
$VAR1 = {
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.1' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.2' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.3' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.4' => '0x0000000000000001',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.5' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.6' => ',',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.7' => '0x000000000000000e',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.8' => '  ',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.9' => '8',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.10' => '0x000000000000001c',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.11' => '0x0000000000000012',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.12' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.13' => '',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.14' => '!',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.15' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.16' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.17' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.18' => '0x0000000000000004',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.19' => ',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.20' => '',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.21' => '',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.22' => '',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.23' => '',
          '.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.24' => ''
        };

请注意,直到第六个端口,结果都匹配,其中 snmpwalk 返回“00 00 00 00 00 00 00 2C”,而我的脚本返回“,”。我在 connUnitPortStatTable 中看到与其他 OID 类似的行为:结果大多与 snmpwalk 一致,但少数不同意。这是 Perl 脚本本身:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use Net::SNMP;

# Custom sort order for OIDs. Only sorts on last number in OID because the rest don't matter in this example
$Data::Dumper::Sortkeys = sub { [ sort { (split '\.', $a)[-1] <=> (split '\.', $b)[-1] } keys %{$_[0]} ] };

my $switch = shift;
my $port = 161;
my $community = <community>; # Edited, obviously

my ($session, $error) = Net::SNMP->session(
                          -hostname      => $switch,
                          -port          => $port,
                          -timeout       => 7,
                          -retries       => 2,
                          -community     => $community,
                        );

if (!defined $session) {
  printf "ERROR: connection failed\n", $error;
  exit 1;
}

my $oid = '.1.3.6.1.3.94.4.5.1.3'; # connUnitPortStatCountError
my $result = $session->get_table(-baseoid => $oid);

if (!defined($result)) {
  printf "ERROR: %s.\n", $session->error();
  $session->close();
  exit 1;
}

$session->close();
print Dumper($result);

exit 0;

编辑:为了永久,这是我根据 PerC 的回答更新的程序:

#!/usr/bin/env perl

use strict;
use warnings;

use Net::SNMP;

my $switch = shift;
my $port = 161;
my $community = <community>; # Edited, obviously

my ($session, $error) = Net::SNMP->session(
                          -hostname      => $switch,
                          -port          => $port,
                          -timeout       => 7,
                          -retries       => 2,
                          -community     => $community,
                          -translate     => [-octetstring => 0],
                        );

if (!defined $session) {
  printf "ERROR: connection failed\n", $error;
  exit 1;
}

my $oid = '.1.3.6.1.3.94.4.5.1.3'; # connUnitPortStatCountError
my $result = $session->get_table(-baseoid => $oid);

if (!defined($result)) {
  printf "ERROR: %s.\n", $session->error();
  $session->close();
  exit 1;
}

$session->close();

foreach my $key (sort { (split '\.', $a)[-1] <=> (split '\.', $b)[-1] } keys %$result) {
  printf "%s => %s\n", $key, unpack "H*", $result->{$key};
}

exit 0;

和输出:

# ./foo <host>
.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.1 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.2 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.3 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.4 => 0000000000000001

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.5 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.6 => 000000000000002c

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.7 => 000000000000000e

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.8 => 0000000000000009

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.9 => 0000000000000038

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.10 => 000000000000001c

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.11 => 0000000000000012

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.12 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.13 => 000000000000000a

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.14 => 0000000000000021

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.15 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.16 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.17 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.18 => 0000000000000004

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.19 => 0000000000000008

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.20 => 000000000000000a

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.21 => 0000000000000000

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.22 => 0000000000000000

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.23 => 0000000000000000

.1.3.6.1.3.94.4.5.1.3.16.0.0.192.221.18.202.254.0.0.0.0.0.0.0.0.24 => 0000000000000000
4

1 回答 1

2

这是因为 Net::SNMP 试图将任何 OCTET_STRING 转换为人类可读的字符串。

请参阅:https ://metacpan.org/module/Net::SNMP#Non-blocking-SNMPv2c-get-bulk-request -for-ifTable 了解说明以及如何解决此问题。

于 2013-04-07T12:43:15.497 回答