一、snmp编程详解
snmp是一构建在tcp/udp上的远程监控应用。它能监控网络中主机的各种信息,如内存使用率,cpu占用率,磁盘占用率等。它主要分为2个部分,安装在待监控主机上的snmp服务端,用于收集主机的信息,并按树形进行组织;安装在监控端的snmp客户端,实时发出查询命令,获得被监控主机的运行信息。
snmp服务端:将主机信息按树形进行组织,有点类似windows的注册表,但是简单得多。树形结构如下图所示。
其中根为空,每个子节点分配一个编号,用点号(。)连接根节点到叶节点经过
的路径上的编号就可以定位到查询的信息。如图中.1.3.6.1.2.1.2就可以访问。 iso 。 org 。 dod 。 internet 。 mgmt 。 mib-2 。 interfaces的信息。
snmp客户端:向snmp服务端发出查询请求,主要有2种请求。get请求可以获取指定信息;getnext获取下一条信息。
另一种情况:snmp服务端在监控到异常事件时主动向snmp监控端发送trap报文,这时snmp客户端充当服务器,对异常信息进行处理。
二、snmp安装
一般linux自带。可用whereis snmpd查询检查是否安装。没有的话下载net-snmp安装。(自己搜)
安装:1)源码安装:。/configure;make;make install
2)包管理器安装:centos:yum install net-snmp
yum install net-snmp-devel(开发环境需要)
yum install net-snmp-utils(测试环境需要)
三、snmp配置
snmp服务端配置:源码里有个example.conf,将其拷贝到自己选定的一个配置文件目录中(假设为/usr/local/etc/snmp/),并重命名为snmpd.conf.
修改里面的配置参数:
1)找到view systemonly included .1.3.6.1.2.1.1,在上面插入一行view systemonly included .1
表示能查看根下面的所有信息
2)将agentaddress udp:127.0.0.1:161中的127.0.0.1改为该机器的外网ip地址,这样就可以远程访问。
四、测试及问题
1)用包管理器安装的运行service snmpd start;源码安装的运行 [snmpd的绝对路径] -c /usr/local/etc/snmp/snmpd.conf
2)在被监控的机器上运行snmpwalk -v 1 localhost -c public .1看是否有输出。
3)在监控主机上运行snmpwalk -v 1 [被监控机器的ip地址] -c public .1看是否有输出
如果无法远程访问,则关闭被监控主机的防火墙:service iptables stop
改变selinux模式:set enforce 0
五、snmp c编程
net-snmp提供了灵活的接口。在被监控主机的snmpd.conf文件中可以添加外部程序,当监控主机发出查询命令时,该程序就执行一次。这样就可以灵活地开发各种监控程序。
如在snmpd.conf添加一行
extend .1.3.6.1.4.1.2021.50 monitor /bin/sh /tmp/monitor.sh
就可以监控主机在每次查询被监控主机的 .1.3.6.1.4.1.2021.50值时执行monitor.sh脚本。
monitor.sh中可以这样写:
#!/bin/bash
echo “my snmp test”
在监控主机端,需要对查询到的结果进行处理。用c语言编程如下:
#include 《net-snmp/net-snmp-config.h》
#include 《net-snmp/net-snmp-includes.h》
#include 《string.h》
int find_last_oid (netsnmp_session * ss,oid *base,int base_length){
netsnmp_pdu *response;
netsnmp_pdu *pdu;
int running = 1;
int status;
int length=0;
pdu = snmp_pdu_create (snmp_msg_getnext);
snmp_add_null_var (pdu, base, base_length);
while (running){
status = snmp_synch_response (ss, pdu, &response);
if (status != stat_success || !response){
snmp_sess_perror (“snmp_synch_response”, ss);
exit (1);
}
if (response-》errstat != snmp_err_noerror){
fprintf (stderr, “snmp: error in packet: %s\n”,snmp_errstring (response-》errstat));
exit (1);
}
if (response &&snmp_oid_compare (response-》variables-》name,snmp_min (base_length,response-》variables-》name_length),base, base_length) != 0)
running = 0;
else{
memcpy(base,response-》variables-》name,response-》variables-》name_length*sizeof(oid));
length=response-》variables-》name_length;
pdu = snmp_pdu_create (snmp_msg_getnext);
snmp_add_null_var (pdu, response-》variables-》name, response-》variables-》name_length);
}
snmp_free_pdu (response);
}
return length;
}
int main(){
netsnmp_session session, *ss;
netsnmp_pdu *pdu;
netsnmp_pdu *response;
struct variable_list *vars;
oid base[128]={1,3,6,1,4,1,2021,50};
size_t base_length=8;
int status;
init_snmp (“apc check”);
snmp_sess_init (&session);
session.version = snmp_version_1;
session.community = (u_char*)“public”;
session.community_len = strlen ((const char*)session.community);
session.peername = “10.0.1.3”;//被监控主机的ip地址
ss = snmp_open (&session);
if (ss == null){
snmp_sess_perror (“snmp_open”, &session);
exit (1);
}
int new_length=find_last_oid (ss, base, base_length);
pdu = snmp_pdu_create (snmp_msg_get);
snmp_add_null_var (pdu, base, new_length);
status = snmp_synch_response (ss, pdu, &response);
if (status != stat_success || !response){
snmp_sess_perror (“snmp_synch_response”, ss);
exit (1);
}
for(vars = response-》variables; vars; vars = vars-》next_variable){
int i;
for(i=0;i《vars-》name_length;i++){
printf(“%d ”,vars-》name[i]);
}
print_value(vars-》name, vars-》name_length, vars);
}
snmp_free_pdu (response);
snmp_close (ss);
return 0;
}
智能来袭 3D电视何去何从?
怎样成为高效程序员
人工智能框架生态峰会2023丨软通动力成为昇思MindSpore开源社区理事会首批成员单位
希捷科技最新推出业界首款16TB银河企业级硬盘
Qorvo宣布推出两款Wi-Fi 6E前端模块
snmp及编程实现
S/HS固态继电器,S/HS固态继电器原理及应用
磁翻板液位计的常见故障分析
考勤这件小事,为什么总是做不好?但眼考勤云来解决考勤问题
Ruff物联网技术可以实现智慧农业吗
激光焊锡机-治具在自动化设备的作用
炼油厂仪表自动化的现状
磁致伸缩位移传感器概述及主要特点
软件升级公告:为昕科技发布智能建库EDA软件V1.0.1版本,欢迎试用!
可穿戴设备出货量显示苹果依然最受欢迎 小米紧追其后
变电站和配电站的区别
GPIB仪器控制设备使用GPIB接口将仪器集成到系统中
什么是显卡/集成显卡?
什么是白平衡?白平衡的作用
带有恒流源的差动放大电路