环境 Centos7
软件net-snmp 版本5.7.3
下载链接 百度网盘
链接:https://pan.baidu.com/s/1CeDGfWrG8_q6gau19fJZeQ
提取码:pitz
一、编写MIB文件
My-MIB.txt文件内容如下,新增的叶子节点myNode的oid为1.3.6.1.4.1.310.1.1
My-MIB DEFINITIONS::= BEGIN IMPORTS enterprises, OBJECT-TYPE, Integer32 FROM SNMPv2-SMI TEXTUAL-CONVENTION, DisplayString FROM SNMPv2-TC; myModule MODULE-IDENTITY LAST-UPDATED "202007231640Z" ORGANIZATION "Organization." CONTACT-INFO "Contact-info." DESCRIPTION "Description." ::= { enterprises 310 } myObj OBJECT IDENTIFIER::={myModule 1} myNode OBJECT-TYPE SYNTAX DisplayString ACCESS read-write STATUS current DESCRIPTION "my node" ::={myObj 1} END
二、使用mib2c命令生成.c和.h文件
上传My-MIB.txt到linux机器的/usr/local/snmp/share/snmp/mibs目录下
1、使用如下命令查看文件格式是否正确
/usr/local/snmp/bin/snmptranslate -Tp -IR My-MIB::myModule
2、执行如下命令生成标量文件
env MIBS="+/usr/local/snmp/share/snmp/mibs/My-MIB.txt" /usr/local/snmp/bin/mib2c -c mib2c.scalar.conf My-MIB::myModule
以上命令执行完后会生成myModule.h和myModule.c文件
生成的原代码(myModule.c):
/* * Note: this file originally auto-generated by mib2c using * $ */ #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-includes.h> #include <net-snmp/agent/net-snmp-agent-includes.h> #include "myModule.h" /** Initializes the myModule module */ void init_myModule(void) { const oid myNode_oid[] = { 1, 3, 6, 1, 4, 1, 310, 1, 1 }; DEBUGMSGTL(("myModule", "Initializing\n")); netsnmp_register_scalar(netsnmp_create_handler_registration ("myNode", handle_myNode, myNode_oid, OID_LENGTH(myNode_oid), HANDLER_CAN_RWRITE)); } int handle_myNode(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { int ret; /* * 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_OCTET_STR, /* * XXX: a pointer to the scalar's data */ , /* * XXX: the length of the data in bytes */ ); 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: /* * or you could use netsnmp_check_vb_type_and_size instead */ ret = netsnmp_check_vb_type(requests->requestvb, ASN_OCTET_STR); if (ret != SNMP_ERR_NOERROR) { netsnmp_set_request_error(reqinfo, requests, ret); } break; case MODE_SET_RESERVE2: /* * XXX malloc "undo" storage buffer */ if ( /* XXX if malloc, or whatever, failed: */ ) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_RESOURCEUNAVAILABLE); } break; case MODE_SET_FREE: /* * XXX: free resources allocated in RESERVE1 and/or * RESERVE2. Something failed somewhere, and the states * below won't be called. */ break; case MODE_SET_ACTION: /* * XXX: perform the value change here */ if ( /* XXX: error? */ ) { netsnmp_set_request_error(reqinfo, requests, /* some error */ ); } break; case MODE_SET_COMMIT: /* * XXX: delete temporary storage */ if ( /* XXX: error? */ ) { /* * try _really_really_ hard to never get to this point */ netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED); } break; case MODE_SET_UNDO: /* * XXX: UNDO and return to previous value for the object */ if ( /* XXX: error? */ ) { /* * try _really_really_ hard to never get to this point */ netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } break; default: /* * we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_myNode\n", reqinfo->mode); return SNMP_ERR_GENERR; } return SNMP_ERR_NOERROR; }
需要对myModule.c文件进行修改,修改后的文件如下(有中文注释的地方就是修改的地方)
/* * Note: this file originally auto-generated by mib2c using * $ */ #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-includes.h> #include <net-snmp/agent/net-snmp-agent-includes.h> #include "myModule.h" /** Initializes the myModule module */ void init_myModule(void) { const oid myNode_oid[] = { 1, 3, 6, 1, 4, 1, 310, 1, 1 }; DEBUGMSGTL(("myModule", "Initializing\n")); netsnmp_register_scalar(netsnmp_create_handler_registration ("myNode", handle_myNode, myNode_oid, OID_LENGTH(myNode_oid), HANDLER_CAN_RWRITE)); } /**定义一个变量*/ static char buff[256]=""; int handle_myNode(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { int ret; /* * 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_OCTET_STR, buff, //定义的变量名称buff strlen(buff) //buff的长度 ); 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: /* * or you could use netsnmp_check_vb_type_and_size instead */ ret = netsnmp_check_vb_type(requests->requestvb, ASN_OCTET_STR); if (ret != SNMP_ERR_NOERROR) { netsnmp_set_request_error(reqinfo, requests, ret); } break; case MODE_SET_RESERVE2: /* * XXX malloc "undo" storage buffer */ if ( 0 /* 出错条件 if malloc, or whatever, failed: */ ) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_RESOURCEUNAVAILABLE); } break; case MODE_SET_FREE: /* * XXX: free resources allocated in RESERVE1 and/or * RESERVE2. Something failed somewhere, and the states * below won't be called. */ break; case MODE_SET_ACTION: /* * XXX: perform the value change here */ if ( 0/* 出错条件 */ ) { netsnmp_set_request_error(reqinfo, requests, 0/* 错误 error */ ); } break; case MODE_SET_COMMIT: /* * XXX: delete temporary storage */ memcpy(buff,requests->requestvb->buf,requests->requestvb->val_len); // 将set的值赋值给变量buff buff[requests->requestvb->val_len] ='\0'; //设置字符串结束符 if ( 0/* 出错条件 */ ) { /* * try _really_really_ hard to never get to this point */ netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED); } break; case MODE_SET_UNDO: /* * XXX: UNDO and return to previous value for the object */ if ( 0/* 出错条件 */ ) { /* * try _really_really_ hard to never get to this point */ netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } break; default: /* * we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_myNode\n", reqinfo->mode); return SNMP_ERR_GENERR; } return SNMP_ERR_NOERROR; }
三、载入自定义的MIB库
1、将myModule.h 和修改后的myModule.c文件复制到linux机器的net-snmp-5.7.1/agent/mibgroup/目录下
2 如果snmp服务在运行,停止snmp服务
3 在/home/net-snmp-5.7.3目录下依次执行下面3个命令编译安装
./configure --prefix=/usr/local/snmp --with-mib-modules='ucd-snmp/diskio ip-mib/ipv4InterfaceTable' --with-mib-modules="myModule" #注myModule是自己扩展的mib库
回车出现下面问题,可以直接回车而不用回答,系统会采用默认信息,其中日志文件默认安装在/var/log/snmpd.log.数据存贮目录默认存放在/var/net-snmp下
1、default version of-snmp-version(3):
2、System Contact Information (@@no.where)(配置该设备的联系信息):
3、System Location (Unknown)(该系统设备的地理位置):
4、Location to write logfile (日志文件位置):
5、Location to Write persistent(数据存储目录):
1、default version of-snmp-version:
2、Systemcontact information(配置该设备的联系人):
3、System location (该设备的位置):
4、Location to write logfile (日志文件位置): /var/log/snmpd.log
5、Location to Write persistent(数据存储目录): /var/net-snmp
编译和安装
make && make install
执行编译并安装“make && make install”命令,如下图所示:
孤傲苍狼
只为成功找方法,不为失败找借口!
Snmp学习总结(六)——linux下安装和配置SNMP
一、安装SNMP
1.1、下载Net-SNMP的源代码
选择一个SNMP版本,比如5.7.1,下载地址如下:net-snmp - Browse /net-snmp/5.7.1 at SourceForge.net,如下图所示:
下载完成之后得到如下图所示的一个压缩包
1.2、把压缩包传输到远程的Linux服务器
把压缩包使用FTP传输工具传输到远程的Linux服务器
上传成功后在linux的root目录下就可以看到压缩包了,如下图所示:
也可以在linux命令行窗口使用ls命令罗列出Root目录所有的文件进行查看,如下图所示:
1.3、对源代码包进行解压缩
使用命令"tar xzvf net-snmp-5.7.1.tar.gz"对下载的源代码包进行解压缩,如下图所示:
解压成功后得到一个net-snmp-5.7.1文件夹,如下图所示:
1.4、通过configure来生成编译规则
使用命令"cd net-snmp-5.7.1"进入net-snmp-5.7.1目录,如下图所示:
net-snmp-5.7.1目录下的configure是可执行文件,如果想指定程序包的安装路径,那么首先建立相应的文件夹来存放安装信息,可以写成./configure –-prefix=/指定的路径名。参数--prefix用来告诉系统安装信息存放的路径,如果没有指定路径,直接执行./configure,那么程序包都会安装在系统默认的目录下,通常为:/usr/local下
执行命令"./configure --prefix=/usr/local/snmp --with-mib-modules='ucd-snmp/diskio ip-mib/ipv4InterfaceTable'",注意,以上的--with-mib-modules=ucd-snmp/diskio选项,可以让服务器支持磁盘I/O监控。如下图所示:
回车出现下面问题,可以直接回车而不用回答,系统会采用默认信息,其中日志文件默认安装在/var/log/snmpd.log.数据存贮目录默认存放在/var/net-snmp下
1、default version of-snmp-version(3):
2、System Contact Information (@@no.where)(配置该设备的联系信息):
3、System Location (Unknown)(该系统设备的地理位置):
4、Location to write logfile (日志文件位置):
5、Location to Write persistent(数据存储目录):
1、default version of-snmp-version:
2、Systemcontact information(配置该设备的联系人):
3、System location (该设备的位置):
4、Location to write logfile (日志文件位置): /var/log/snmpd.log
5、Location to Write persistent(数据存储目录): /var/net-snmp
1.5、编译和安装
执行编译并安装"make && make install"命令,如下图所示:
1.6、配置snmpd.conf
使用"ls"命令查看/usr/local/snmp目录下是否存在etc目录,如果不存在etc目录,就创建一个,如下图所示:
查看结果显示不存在etc目录,在/usr/local/snmp目录下创建一个etc目录,创建etc目录命令"mkdir /usr/local/snmp/etc",如下图所示:
找到SNMP源码目录(net-snmp-5.7.1)下EXAMPLE.conf文件,如下图所示:
复制EXAMPLE.conf文件到到/usr/local/snmp/etc目录,并重命名为snmpd.conf:"cp EXAMPLE.conf /usr/local/snmp/etc/snmpd.conf"
使用vi编辑器打开snmpd.conf文件:"vi /usr/local/snmp/etc/snmpd.conf",编辑snmpd.conf文件中的内容
按下键盘上的字母【I】或者【Insert】键进入vi编辑器的编辑模式
要配置snmpd.conf中内容如下:
1、配置允许网络访问
找到【AGENT BEHAVIOUR】,如下图所示:
修改如下:添加"agentAddress udp:161"配置项,如下图所示:
2、选择v2c SNMP协议的版本
找到【ACTIVE MONITORING】,如下图所示:
修改如下:
3、设置访问权限
找到【ACCESS CONTROL】如下图所示:
找到【rocommunity public default -V systemonly】,把 -V systemonly去掉,这是设置访问权限的,去掉后能访问全部,如下图所示:
4、保存snmpd.conf后退出
按下键盘左上角上的【Esc】键退出vi编辑器的编辑模式,然后输入命令":wq"保存文件并退出,如下图所示:
经过以上的4个步骤,针对SNMP的snmpd.conf文件的配置工作算是全部完成了。
启动snmp服务
由于我们刚才修改SNMP的snmpd.conf文件,所以在启动snmp服务之前,先使用命令"ps aux | grep snmp | grep -v grep |awk '{print $2}'| xargs kill"关闭snmp的相关服务,如下图所示:
使用"netstat -an |grep 161"查看snmp的服务是否启动,如下图所示:
启动snmp服务:"/usr/local/snmp/sbin/snmpd -c /usr/local/snmp/etc/snmpd.conf",如下图所示:
测试SNMP
获取本机的系统名字,使用命令:"snmpget -v 2c -c public localhost sysName.0"或者"snmpget -v 2c -c public 本机的ip地址 sysName.0"或者"snmpget -v 2c -c public 本机的ip地址 .1.3.6.1.2.1.1.5.0"进行测试,
执行以下的几个命令都可以获取到本机的系统名字:
snmpget -v 2c -c public localhost sysName.0
snmpget -v 2c -c public 127.0.0.1 sysName.0
snmpget -v 2c -c public 192.168.1.229 sysName.0
snmpget -v 2c -c public localhost .1.3.6.1.2.1.1.5.0
snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.1.5.0
snmpget -v 2c -c public 192.168.1.229 .1.3.6.1.2.1.1.5.0
如下图所示:
能够正常返回系统的名字就说明SNMP安装配置成功了。也可以使用命令"snmpget --version"查看当前的安装版本号来验证是否安装成功,如果安装成功,则显示当前的安装版本号,如下图所示:
查看myNode的值 (这里set不成功,所以可以在get接口处进行编写自己想要的所以结果)
/usr/local/snmp/bin/snmpget -v 2c -c public localhost 1.3.6.1.4.1.310.1.1.0
安装net-snmp 转载: Snmp学习总结(六)——linux下安装和配置SNMP - 孤傲苍狼 - 博客园
转载:【snmp】net-snmp添加自定义MIB(标量) - harara-小念 - 博客园
net-snmp添加自定义MIB(表格)见:【snmp】net-snmp添加自定义MIB(表格)
常用命令:
配置命令
./configure --prefix=/usr/local/snmp --with-mib-modules='ucd-snmp/diskio ip-mib/ipv4InterfaceTable' --with-mib-modules="vsRoot"
将扩展mib库文件转化为.c .h文件
env MIBS="+/usr/local/snmp/share/snmp/mibs/My-MIB.txt" /usr/local/snmp/bin/mib2c -c mib2c.scalar.conf My-MIB::myModule
杀死snmp服务进程
ps aux | grep snmp | grep -v grep |awk '{print $2}'| xargs kill
启动snmp服务进程
/usr/local/snmp/sbin/snmpd -c /usr/local/snmp/etc/snmpd.conf
查看某OID的值
/usr/local/snmp/bin/snmpget -v 2c -c public localhost 1.3.6.1.4.1.310.1.1.0