首先我们把前面mib2c生成的文件修改 下面重新做了个简单点的MIB树
--
--
-- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88
-- Saturday, July 26, 2025 at 09:24:54
--
ARHANGELSK-GLOBAL-REG DEFINITIONS ::= BEGIN
IMPORTS
enterprises, OBJECT-TYPE, MODULE-IDENTITY
FROM SNMPv2-SMI;
-- 1.3.6.1.4.1.2
arhangelskNode1 MODULE-IDENTITY
LAST-UPDATED "202507251837Z" -- July 25, 2025 at 18:37 GMT
ORGANIZATION
"Organization."
CONTACT-INFO
"Contact-info."
DESCRIPTION
"Description."
::= { enterprises 2 }
--
-- Node definitions
--
-- 1.3.6.1.4.1.2.1
arhangelskNode0 OBJECT-TYPE
SYNTAX INTEGER
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"Description."
::= { arhangelskNode1 1 }
END
--
--
--
只有一个int型的值 可读写
然后我们使用mib2c生成对应的框架代码 ,这里只有标量 所以只需要生成一次,生成之后我们把对应的c文件改成如下:
/*
* Note: this file originally auto-generated by mib2c
* using mib2c.scalar.conf
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "arhangelskNode1.h"
/* 定义标量节点的 OID 和存储变量 */
#define ARHANGELSKNODE0_OID "1.3.6.1.4.1.2.1"
static int arhangelskNode0_value = 42; // 初始值
/** Initializes the arhangelskNode1 module */
void
init_arhangelskNode1(void)
{
const oid arhangelskNode0_oid[] = { 1,3,6,1,4,1,2,1 };
DEBUGMSGTL(("arhangelskNode1", "Initializing\n"));
netsnmp_register_scalar(
netsnmp_create_handler_registration("arhangelskNode0", handle_arhangelskNode0,
arhangelskNode0_oid, OID_LENGTH(arhangelskNode0_oid),
HANDLER_CAN_RWRITE
));
}
int
handle_arhangelskNode0(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{
int ret;
int new_value;
/* We are never called for a GETNEXT if it's registered as a
"instance", as it's "magically" handled for us. */
/* a instance handler also only hands us one request at a time, so
we don't need to loop over a list of requests; we'll only get one. */
switch(reqinfo->mode) {
case MODE_GET:
/* 返回当前值 */
snmp_set_var_typed_value(
requests->requestvb,
ASN_INTEGER, // 数据类型
(u_char*)&arhangelskNode0_value, // 数据指针
sizeof(arhangelskNode0_value) // 数据长度
);
break;
/*
* SET REQUEST
*
* multiple states in the transaction. See:
* http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg
*/
case MODE_SET_RESERVE1:
/* 验证输入类型 */
ret = netsnmp_check_vb_type(requests->requestvb, ASN_INTEGER);
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, requests, ret);
return ret;
}
break;
case MODE_SET_RESERVE2:
/* 分配临时存储(非必需,此处省略) */
break;
case MODE_SET_FREE:
/* 释放临时资源(此处省略) */
break;
case MODE_SET_ACTION:
/* 更新值并验证范围 */
new_value = *(int*)requests->requestvb->val.string;
if (new_value < 0 || new_value > 100) {
return SNMP_ERR_WRONGVALUE; // 值越界
}
arhangelskNode0_value = new_value;
break;
break;
case MODE_SET_COMMIT:
/* 提交变更(此处省略) */
break;
case MODE_SET_UNDO:
/* 回滚变更(此处省略) */
break;
default:
/* we should never get here, so this is a really bad error */
snmp_log(LOG_ERR, "unknown mode (%d) in handle_arhangelskNode0\n", reqinfo->mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
这里主要修改了设置和获取值时候的逻辑
修改完之后 我们就可以把这些代码集成到net-snmp
我们先从官网下载net-snmp
这里我下载的是net-snmp-5.9.4
先安装依赖环境
apt install -y build-essential libssl-dev libperl-dev pkg-config
然后解压源码包,解压后:
把我们前面mib2c生成的.c .h文件拷贝到源码目录agent/mibgroup下面
然后进行配置 configure后面接的是我们的模块名
./configure --with-mib-modules="arhangelskNode1"
然后就是 编译生成 make 、make install
完成之后 会在 snmpd 会拷贝到 /usr/local/sbin/snmpd
源码编译之后没有snmpd.conf 自己可以从其他地方拷贝一个 或者vi新建一个
然后就可以通过 如下命令启动snmpd snmpd.conf在当前目录下
snmpd -c snmpd.conf
如果提示
snmpd: error while loading shared libraries: libnetsnmpagent.so.40: cannot open shared object file: No such file or directory
实际这个文件存在
这个时候需要ldconfig就好了
有其他文件我们可以通过snmpd -c /etc/snmp/snmpd.conf -f -Le -d 命令调试启动过程中遇到的问题
启动之后我们就可以测试了
假设我们的配置文件snmpd.conf如下:
# 创建用户时指定不同密码
createUser test MD5 "12345678" DES "123456789"
rwuser test
# 视图配置
view SystemView included .1.3.6.1.4.1.2
view SystemView included .1.3.6.1.2.1.25.1
# 访问控制
rocommunity public default -V SystemView
然后我们启动snmpd 测试结果如下
注意最后一项 不能省略后面的.0 不然会提示有问题 这里也可以看到 DES没有用 具体我也不知道为什么 但是如果带了des参数的话不能太短 应该是对密码长度有要求