SNMP V3 和 Perl

0 投票
1 回答
3373 浏览
提问于 2025-04-18 17:44

我正在尝试在Linux上使用SNMPget来获取我网络中设备的信息。我可以在Linux终端上成功使用snmpget,但现在我想写一个perl或python的脚本,让它为我完成这个工作。

SNMPget的示例

snmpgetnext -v 3 -n "" -u USER -a MD5 -A PASSWORD -l authNoPriv 192.168.1.1 sysDescr

我想在perl中做同样的事情,但我找不到好的文档来指导我该怎么做。我在网上找到了一些东西(不过这不是SNMP v3的内容):

$cat snmp

#!/usr/bin/perl
use Net::SNMP;
my $desc = 'sysDescr';
( $session, $error ) = Net::SNMP->session(
    -hostname  => "192.168.1.1",
    -community => "public",
    -timeout   => "30",
    -port      => "161"
);

if ( !defined($session) ) {
    printf( "ERROR: %s.\n", $error );
    exit 1;
}
my $response = $session->get_request($desc);
my %pdesc    = %{$response};

my $err = $session->error;
if ($err) {
    return 1;
}
print %pdesc;
exit 0;

我尝试将其修改为snmp v3,但没有成功。有没有人对此熟悉的?

1 个回答

1

SNMPv3比v1和v2c复杂得多,它至少需要用户名(这点和v1、v2c一样),而在实际使用中,你还必须添加认证和隐私协议以及密码。

你可以查看官方的NET::SNMP文档,学习如何使用这个模块。我这里提供一个关于设置(而不是获取)使用的例子:

#! /usr/local/bin/perl

use strict;
use warnings;

use Net::SNMP;

my $OID_sysContact = '1.3.6.1.2.1.1.4.0';

my ($session, $error) = Net::SNMP->session(
   -hostname     => 'myv3host.example.com',
    -version      => 'snmpv3',
   -username     => 'myv3Username',
   -authprotocol => 'sha1',
   -authkey      => '0x6695febc9288e36282235fc7151f128497b38f3f',
   -privprotocol => 'des',
   -privkey      => '0x6695febc9288e36282235fc7151f1284',
);

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

my $result = $session->set_request(
   -varbindlist => [ $OID_sysContact, OCTET_STRING, 'Help Desk x911' ],
);

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

printf "The sysContact for host '%s' was set to '%s'.\n",
      $session->hostname(), $result->{$OID_sysContact};

$session->close();

exit 0;

创建会话的部分($session)是主要问题,之后你可以像使用v1/v2c那样使用常规命令。

另一个问题是,你需要请求OID(例如 .1.3)格式,而不是字符串名称,除非你导入一个MIB模块来进行转换。

祝你好运……

撰写回答