snmpget未触发net snmp perl子代理

snmpget未触发net snmp perl子代理,perl,snmp,mib,Perl,Snmp,Mib,我一直在开发一个定制的SNMP Mib,在试图让代理返回正确的数据时遇到了困难 MIB(通过运行smilint-l 6验证): 代理文件: #!/usr/bin/perl use NetSNMP::OID(':all'); use NetSNMP::agent(':all'); use NetSNMP::ASN(':all'); sub myhandler { my ($handler, $registration_info, $request_info, $requests) =

我一直在开发一个定制的SNMP Mib,在试图让代理返回正确的数据时遇到了困难

MIB(通过运行smilint-l 6验证):

代理文件:

#!/usr/bin/perl

use NetSNMP::OID(':all');
use NetSNMP::agent(':all');
use NetSNMP::ASN(':all');

sub myhandler {
    my  ($handler, $registration_info, $request_info, $requests) = @_;
    print "Handling request\n";
    for ($request = $requests; $request; $request = $request->next()) {
        #
        #  Work through the list of varbinds
        #
        my $oid = $request->getOID();
        print "Got request for oid $oi\n";
        if ($request_info->getMode() == MODE_GET) {
            if ($oid == new NetSNMP::OID($rootOID . ".3")) {
                $request->setValue(ASN_INTEGER, 2);
            }
        }
    }
}

{
    $subagent = 0;

    print "Running new agent\n";
    my $rootOID = ".1.3.6.1.4.1.42134";
    my $regoid = new NetSNMP::OID($rootOID);
    if (!$agent) {
        $agent = new NetSNMP::agent('Name'=>'my_agent_name','AgentX' => 1);
        $subagent = 1;
        print "Starting subagent\n";
    }
    print "Registering agent\n";
    $agent->register("my_agent_name", $regoid, \&myhandler);
    print "Agent registered\n";

    if ($subagent) {
        $SIG{'INT'} = \&shut_it_down;
        $SIG{'QUIT'} = \&shut_it_down;
        $running = 1;

        while ($running) {
            $agent->agent_check_and_process(1);
        }

        $agent->shutdown();
    }
}

sub shut_it_down() {
    $running = 0;
    print "Shutting down agent\n";
}
当我运行代理时,我得到以下信息:

Running new agent
Starting subagent!
Registering agent with oid idb
Agent registered
所以我知道很多都在起作用。但是,当我运行以下命令时:

snmpget -v 1 -c mycommunity localhost:161 test2.0
我收到以下错误消息:

Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: IDB-MIB::test2.0
我从snmptranslate知道mib文件设置正确。我甚至查看了snmpget的调试(使用-DALL)以确保正确加载和解析mib

所以我的问题是:为什么我的子代理没有通过请求

更新:

@EhevuTov告诉我,我的MIB文件无效,但是smilint没有报告任何问题,并且运行
snmpget-v 2c-c mycommunity localhost:161.1.3.6.1.4.1.42134.3.0
没有正确报告对象的名称(IDB-MIB::test2.0),但没有找到任何数据

我得到的
IDB-MIB::test2=在这个OID的代理上没有这样的对象可用
,这使我认为我的代理没有正确注册,但是它没有抛出任何错误

更新2:

我一直在摆弄代理代码。根据CPAN文档(),如果调用成功,
$agent->register
函数应该返回
0
。所以我检查了返回码,得到了这个:

Agent registered. Result: NetSNMP::agent::netsnmp_handler_registration=SCALAR(0x201e688)
使用
Data::Dumper
打印出来会导致:

$VAR1 = bless( do{\(my $o = 34434624)}, 'NetSNMP::agent::netsnmp_handler_registration' );

我模模糊糊地理解祝福的作用,但即使如此,我也不知道这个结果意味着什么。所以我开始觉得这个经纪人是错的。有人知道如何调试这些代理吗?是否有地方可以查看它是否正确加载到主snmpd中?

我已经解决了这个问题。这不是MIB的问题,而是代理的问题(我一直认为代理工作得很好,所以我从不费心去检查)

我一直在独立运行代理,因为它看起来工作正常(注册处理程序时从未抛出任何错误)。显然,它需要由snmpd直接运行

我将其移动到snmpd可以访问的目录中(因为snmpd显然也不能从/root运行脚本,即使它是以root身份运行的),并在snmpd.conf中添加了以下行:

perl print "\nRunning agents now\n";
perl do "/usr/share/snmp/agent.pl" || print "Problem running agent script: $!\n";
perl print "Agents run\n";
请注意,这两行已经存在:

disablePerl false
perlInitFile /usr/share/snmp/snmp_perl.pl
我现在可以运行snmpget命令并获得预期的响应

> snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3
IDB-MIB::test2 = INTEGER: 2 tests

看起来你没有合适的MIB。啊,打字错误。修复了这个问题,但它似乎仍然无法工作(我通过mib检查器运行了它,以确保没有其他问题)如果您使用的是*nix操作系统,那么我建议安装
libsmi
,这是一个库和软件套件,并使用它的
smilint
mib检查器。我编写了一个.sh脚本,每当我更改/写入新的MIB时,它都会帮我检查。谢谢,非常有用。它显示了我的MIB中的另一个错误,我也修复了这个错误。但即使在那之后(为了以防万一重新启动snmpd),代理仍然没有被调用。请注意,MIB没有显示任何进一步的问题。当您运行
snmpget-v1-cmycommunity localhost:161 test2
或:
snmpget-v1-cmycommunity localhost:161 test2.0.1
> snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3
IDB-MIB::test2 = INTEGER: 2 tests