You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现标量mib2c模板遇SNMP查询报错,求成功实现示例资源

解决Net-SNMP mib2c标量模板无响应问题及示例实现

关键前置排查点

  • 确认MIB文件加载:将MY-MIB.txt放入Net-SNMP默认MIB目录(如/usr/share/snmp/mibs/),或执行snmp请求时加-m +MY-MIB参数强制加载。
  • 代理配置检查:在snmpd.conf中添加pass_persist .1.3.6.1.4.1.XXXXX.1 /path/to/your/agent_binary,其中OID替换为你MIB中标量节点的父级OID,路径替换为编译后的代理程序路径。
  • 编译验证:编译时必须链接Net-SNMP库,示例命令:gcc -o my_scalar_agent my_scalar.c -lnetsnmp,确保无编译报错。

选项2模板最简可运行示例(零代码修改)

假设你的MIB标量定义如下:

MY-MIB DEFINITIONS ::= BEGIN
IMPORTS
    enterprises FROM SNMPv2-SMI;

myMIBObjects OBJECT IDENTIFIER ::= { enterprises 12345 1 }
mibName OBJECT-TYPE
    SYNTAX INTEGER (0..100)
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION "Test scalar value"
    ::= { myMIBObjects 1 }
END

操作步骤:

  1. 运行mib2c mibName,选择net-snmp -> scalar -> 2生成代码。
  2. 编译代码:gcc -o mibName_agent mibName.c -lnetsnmp。
  3. 修改snmpd.conf,添加:pass_persist .1.3.6.1.4.1.12345.1 ./mibName_agent。
  4. 重启snmpd服务:systemctl restart snmpd。
  5. 测试请求:snmpget -v2c -c public localhost MY-MIB::mibName,应返回MY-MIB::mibName = INTEGER: 0。

选项1模板自定义实现示例

若选择选项1,需手动实现数据逻辑,关键代码片段如下:

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "mibName.h"

// 自定义存储标量值的变量
static long mibName_value = 42;

// 处理GET请求的函数
int handle_mibName(netsnmp_mib_handler *handler,
                   netsnmp_handler_registration *reginfo,
                   netsnmp_agent_request_info *reqinfo,
                   netsnmp_request_info *requests)
{
    switch(reqinfo->mode) {
        case MODE_GET:
            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
                                     (u_char *)&mibName_value,
                                     sizeof(mibName_value));
            break;
        default:
            return SNMP_ERR_GENERR;
    }
    return SNMP_ERR_NOERROR;
}

void init_mibName(void)
{
    static oid mibName_oid[] = { 1,3,6,1,4,1,12345,1,1 };
    netsnmp_handler_registration *reg;

    reg = netsnmp_create_handler_registration("mibName", handle_mibName,
                                              mibName_oid, OID_LENGTH(mibName_oid),
                                              HANDLER_CAN_RONLY);
    netsnmp_register_scalar(reg);
    snmp_log(LOG_INFO, "init_mibName called successfully\n");
}

编译测试步骤与选项2一致,测试时会返回MY-MIB::mibName = INTEGER: 42。

核心问题排查(init触发但处理函数未执行)

  • 核对pass_persist配置的OID:必须与标量节点的父级OID完全匹配(如标量OID为.1.3.6.1.4.1.12345.1.1,父OID为.1.3.6.1.4.1.12345.1)。
  • 用snmpwalk -v2c -c public localhost .1.3.6.1.4.1.12345遍历OID分支,确认节点是否存在。
  • 启动snmpd时加调试参数:snmpd -f -Le -d,查看请求OID与注册OID是否匹配。

内容的提问来源于stack exchange,提问作者bleedingedge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:01:07