首先我們把前面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參數的話不能太短 應該是對密碼長度有要求