实现标量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
操作步骤:
- 运行
mib2c mibName,选择net-snmp -> scalar -> 2生成代码。 - 编译代码:
gcc -o mibName_agent mibName.c -lnetsnmp。 - 修改
snmpd.conf,添加:pass_persist .1.3.6.1.4.1.12345.1 ./mibName_agent。 - 重启snmpd服务:
systemctl restart snmpd。 - 测试请求:
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
相关产品推荐
相关产品推荐

