当前位置: 首页 > news >正文

net-snmp添加自定义mib树

首先我们把前面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 ::= BEGINIMPORTSenterprises, OBJECT-TYPE, MODULE-IDENTITY			FROM SNMPv2-SMI;-- 1.3.6.1.4.1.2arhangelskNode1 MODULE-IDENTITY LAST-UPDATED "202507251837Z"		-- July 25, 2025 at 18:37 GMTORGANIZATION "Organization."CONTACT-INFO "Contact-info."DESCRIPTION "Description."::= { enterprises 2 }--
-- Node definitions
---- 1.3.6.1.4.1.2.1arhangelskNode0 OBJECT-TYPESYNTAX INTEGERMAX-ACCESS read-writeSTATUS currentDESCRIPTION"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, sowe 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

这里我下载的是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参数的话不能太短 应该是对密码长度有要求

http://www.xdnf.cn/news/1189279.html

相关文章:

  • 【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p
  • 详解力扣高频SQL50题之619. 只出现一次的最大数字【简单】
  • PCIe 的L状态(链路状态)和D状态(设备状态)
  • 前端组件梳理
  • 【WPF】NumericUpDown的用法
  • 【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php
  • 教育培训系统源码解析:如何打造高可扩展的在线学习平台?
  • 【CTF-Web】dirsearch寻找download.php进行?path=flag.txt任意文件下载
  • Android Studio 提示信息 ‘equals(““)‘ can be replaced with ‘isEmpty()‘
  • 《Java 程序设计》第 6 章 - 字符串
  • VTK交互——Callback
  • NLua和C#交互
  • 访问者模式感悟
  • 泰山派GPIO编译 ADB下载 万用表测量GPIO电压
  • 【ELasticsearch】节点角色分类与作用解析
  • OpenCV学习探秘之二 :数字图像的矩阵原理,OpenCV图像类与常用函数接口说明,及其常见操作核心技术详解
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • AI 编程工具 Trae 重要的升级。。。
  • 经典IDE之Turbo C
  • nginx的 `root` 和 `alias` 笔记250726
  • 0.深度学习环境配置步骤
  • VTK交互——ClientData
  • 英语听力口语词汇-8.美食类
  • (AC)Playlist
  • 【橘子分布式】gRPC(番外篇-监听流)
  • 15.6 DeepSpeed+Transformers实战:LLaMA-7B训练效率提升210%,显存直降73%
  • 前端设计中如何在鼠标悬浮时同步修改块内样式
  • Cgroup 控制组学习(一)
  • 基于深度学习的图像分类:使用Inception-v3实现高效分类
  • 前端基础知识Vue系列 - 29(怎么处理vue项目中的错误)