SNMP学习笔记之SNMP的安装及Python的调用
0x00 概述
本文是介绍SNMP在Windows和Linux(Ubuntu)下的安装,以及通过Python调用其接口的文章。
0x01 开发环境
- Python 3.5.1
- Windows 10 64位,Ubuntu 16.04 64位(虚拟机)
0x02 SNMP
SNMP(简单网络管理协议),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。
0x03 MIB
MIB(Management Information Base),管理信息库,由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。
0x04 Windows下安装SNMP
下载链接:https://sourceforge.net/projects/net-snmp/
之后直接安装即可,默认安装路径是C:\usr。
安装完后在系统变量下添加:C:\usr\bin,打开cmd输入snmpget测试,没有报错则说明安装成功。
0x05 Ubuntu下安装SNMP和配置
下载
$ sudo apt-get install snmpd snmp snmp-mibs-downloader
查看SNMP服务状态
$ sudo service snmpd status
简单测试SNMP服务是否正常
$ snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.1.1 SNMPv2-MIB::sysDescr.0 = STRING: Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64
默认情况下,snmp服务只是对本地开启,是无法通过远程获取该主机的snmp信息的。所以要设置允许远程主机访问
$ sudo netstat -antup | grep 161
udp 0 0 127.0.0.1:161 0.0.0.0:* 10698/snmpd
可以看到,161端口只对本机开放(161端口号是snmp服务的端口号),我们需要修改一下,让snmp服务对外开放。
修改/etc/snmp/snmpd.conf配置文件,大概在15行,将下面一行注释掉:agentAddress udp:127.0.0.1:161
重新启动snmp服务,再通过命令观察:
$ sudo /etc/init.d/snmpd restart $ sudo netstat -antup | grep 161 udp 0 0 0.0.0.0:161 0.0.0.0:* 10763/snmpd
可以看到SNMP服务已经对外开放了,这样之后,我们就能在远程主机进行测试。
由于SNMP默认只能查看两个设备节点,要想查看所有节点还需要进行一些配置。打开/etc/snmp/snmpd.conf
sudo vim /etc/snmp/snmpd.conf # 在大约45行处添加下面一行
view systemonly included .1
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
最后配置一下mibs,否则可能会报Unknown Object Identifier错误。打开/etc/snmp/snmp.conf,注释掉mibs:就可以了
sudo vim /etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line. #mibs :
0x06 Windows下调用SNMP查看其他主机信息
由于博主使用的是Ubuntu虚拟机,其IP是192.168.132.130。下面是cmd下通过SNMP查看该主机的信息。
打开cmd,输入
snmpwalk -v 2c -c public 192.168.132.130 1.3.6.1.2.1.1.1
返回
SNMPv2-MIB::sysDescr.0 = STRING: Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64
成功。
0x07 Python代码调用示例
Python代码调用系统的snmpwalk指令来查询设备信息。
# coding=utf-8 """
filename:snmp_test.py 说明:
使用系统的 snmpwalk 来查询设备信息,需要先安装 snmp
代码 Windows 和 Linux 通用 Windows cmd 调用示例:snmpwalk -v 2c -c public 127.0.0.1 1.3.6.1.2.1.1.1 Windows cmd 下查看某主机(192.168.132.130)信息示例:
snmpwalk -v 2c -c public 192.168.132.130 1.3.6.1.2.1.1.1
""" import re
import os
import time
import platform if 'Windows' == platform.system():
hosts = ['192.168.132.130']
else: # 在虚拟机运行时则查看本地
hosts = ['127.0.0.1'] def snmpWalk(host, oid):
result = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split('\n')[:-1]
return result # ------------------------------------------------------------
# 获取系统信息
# ------------------------------------------------------------
def getSystem(host):
system = ':'.join(snmpWalk(host, 'system')[0].split(':')[3:]).strip()
return system # ------------------------------------------------------------
# 获取负载信息
# ------------------------------------------------------------
def getLoad(host, loid):
"""系统负载"""
load_oids = '1.3.6.1.4.1.2021.10.1.3.' + str(loid)
return snmpWalk(host, load_oids)[0].split(':')[3] def getLoads(host):
load1 = getLoad(host, 1)
load10 = getLoad(host, 2)
load15 = getLoad(host, 3)
return load1, load10, load15 # ------------------------------------------------------------
# 获取网卡流量
# ------------------------------------------------------------
def getNetworkDevices(host):
"""获取网络设备信息"""
device_mib = snmpWalk(host, 'RFC1213-MIB::ifDescr')
device_list = [] for item in device_mib: device_list.append(item.split(':')[3].strip())
return device_list def getNetworkData(host, oid):
"""获取网络流量"""
data_mib = snmpWalk(host, oid)
data = []
for item in data_mib:
byte = float(item.split(':')[3].strip())
data.append(str(round(byte / 1024, 2)) + ' KB')
return data def getNetworkInfo(host):
device_list = getNetworkDevices(host)
# 流入流量
inside = getNetworkData(host, 'IF-MIB::ifInOctets')
# 流出流量
outside = getNetworkData(host, 'IF-MIB::ifOutOctets')
return device_list, inside, outside # ------------------------------------------------------------
# 内存使用率
# ------------------------------------------------------------
def getSwapTotal(host):
swap_total = snmpWalk(host, 'UCD-SNMP-MIB::memTotalSwap.0')[0].split(' ')[3]
return swap_total def getSwapUsed(host):
swap_avail = snmpWalk(host, 'UCD-SNMP-MIB::memAvailSwap.0')[0].split(' ')[3]
swap_total = getSwapTotal(host)
swap_used = str(round(((float(swap_total) - float(swap_avail)) / float(swap_total)) * 100, 2)) + '%'
return swap_used def getMemTotal(host):
mem_total = snmpWalk(host, 'UCD-SNMP-MIB::memTotalReal.0')[0].split(' ')[3]
return mem_total def getMemUsed(host):
mem_total = getMemTotal(host)
mem_avail = snmpWalk(host, 'UCD-SNMP-MIB::memAvailReal.0')[0].split(' ')[3]
mem_used = str(round(((float(mem_total) - float(mem_avail)) / float(mem_total)) * 100, 2)) + '%'
return mem_used def getMemInfo(host): mem_used = getMemUsed(host)
swap_used = getSwapUsed(host) return mem_used, swap_used # ------------------------------------------------------------
def main():
for host in hosts:
print('=' * 10 + host + '=' * 10)
start = time.time()
print("系统信息")
system = getSystem(host)
print(system)
print("系统负载")
load1, load10, load15 = getLoads(host)
print('load(5min): %s ,load(10min): %s ,load(15min): %s' % (load1, load10, load15))
print("网卡流量")
device_list, inside, outside = getNetworkInfo(host)
for i, item in enumerate(device_list):
print('%s : RX: %-15s TX: %s ' % (device_list[i], inside[i], outside[i]))
mem_used, swap_used = getMemInfo(host) print("内存使用率")
print('Mem_Used = %-15s Swap_Used = %-15s' % (mem_used, swap_used))
end = time.time()
print('run time:', round(end - start, 2), 's') if __name__ == '__main__':
main()
Windows下打印:
==========192.168.132.130==========
系统信息
Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64
系统负载
load(5min): 0.03 ,load(10min): 0.03 ,load(15min): 0.00
网卡流量
lo : RX: 1861.91 KB TX: 1861.91 KB
Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) : RX: 5733.84 KB TX: 336.49 KB
内存使用率
Mem_Used = 93.82% Swap_Used = 0.07%
run time: 2.89 s
Ubuntu下打印:
==========127.0.0.1==========
系统信息
Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64
系统负载
load(5min): 0.02 ,load(10min): 0.02 ,load(15min): 0.00
网卡流量
lo : RX: 1861.91 KB TX: 1861.91 KB
Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) : RX: 5738.8 KB TX: 338.76 KB
内存使用率
Mem_Used = 94.14% Swap_Used = 0.07%
run time: 0.26 s
参考
SNMP学习笔记之SNMP的安装及Python的调用的更多相关文章
- SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息
0x00 SNMP TRAP简介 SNMP(Simple Network Management Protocol) trap是一种很有用,但是也容易让人难以理解的协议. 虽然名字叫做简单网络管理协议, ...
- SNMP学习笔记之SNMP 原理与实战详解
原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- SNMP学习笔记之SNMP介绍,OID及MIB库
1.1. SNMP概览 SNMP的基本知识介绍简单网络管理协议(SNMP-Simple Network Management Protocol)是一个与网络设备交互的简单方法.该规范是由IETF ...
- SNMP学习笔记之SNMP简单概述
0x00 SNMP简单概述 0.1.什么是Snmp SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理 ...
- SNMP学习笔记之SNMP报文以及不同版本(SNMPv1、v2c、v3)的区别
本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1.v2c.v3)进行区别! 四.SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Agent)之间交换的管理信息构成了SNMP报 ...
- SNMP学习笔记之Linux下安装和配置SNMP
注意:本篇安装用户是root,非root用户启动的时候会报缺少文件错误. 一.安装SNMP 1.1.下载Net-SNMP的源代码 选择一个SNMP版本,比如5.7.1,下载地址如下:http://so ...
- SNMP学习笔记之SNMP树形结构介绍
Basic command of SNMP: GET: The GET operation is a request sent by the manager to the managed device ...
- SNMP学习笔记之SNMP报文协议详解
0x00 简介 简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
随机推荐
- CentOS环境下jdk安装部署
1.准备jdk安装文件: 这里我使用的是 jdk-7u79-linux-x64.tar.gz 2.在 /usr/local 目录下创建 sotfware目录,并上传JDK文件: 解压文件并修改文件夹为 ...
- Nginx 安装 --编译模块参数
公司空出来一些服务器,很久没有来练手了,于是便开始有了这篇博客,记录下过程. Nginx 这个不多说了,名声在外,人们喜爱使用这款软件,主要还是因为它的高并发特性,公司也在用效果还不错,也用了它的一些 ...
- openstack 部署(Q版)-----环境准备篇
一.环境准备 系统:centos7 cinder01 内网:192.168.10.51 外网:172.16.1.51 compute01 内网:192.168.10.52 外网:172.16.1. ...
- hihocoder 1284 - 机会渺茫
N有N_cnt个约数,M有M_cnt个约数,那么总共有N_cnt * M_cnt种对应情况. 假设其中有D_cnt个对应结果是相等的,而这D_cnt个数正好是gcd(N,M)的所有约数. 例如: N= ...
- HDU - 5651 xiaoxin juju needs help 逆元模板
http://acm.hdu.edu.cn/showproblem.php?pid=5651 题意:生成回文串.输出所有回文串的可能数. 题解:mod除法会损失高位,用逆元来代替除法,模板如下 ac代 ...
- HDFS文件上传
下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 1)首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. 2)NameNode与各DataNode使 ...
- cocoapods卸载与安装
引用自:https://www.aliyun.com/jiaocheng/389907.html 一.首先卸载pod which pod 得到pod的路径 sudo rm -rf <pod的路径 ...
- nginx map使用方法
map指令使用ngx_http_map_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_map_module.ngx_http_map_modu ...
- Crontab '2>&1 &' 含义
Crontab '2>&1 &' 含义 - dosttyy - 博客园 https://www.cnblogs.com/dosttyy/p/4810026.html
- httpd.conf .htaccess apache 服务器配置
PHP Advanced and Object-Oriented Programming Larry Ullman The standard solution in these situations ...