python snmp 自动化2-在python中使用snmp
#2012-02-23 磁针石
#承接软件自动化实施与培训 验证码破解 软件破解 脚本开发 测试和python培训等
#gtalk: ouyangchongwu#gmail.com qq 37391319 博客:testing.blog.chinaunix.net
#版权所有,转载刊登请来函联系
#自动化测试和python群组: http://groups.google.com/group/automation_testing_python
#python qq group: 深圳自动化测试python群:113938272
#武冈深圳qq群:66250781 都梁深圳湖南户外群:49494279
#参考资料
Pysnmp是一个纯python的snmp模块,不过我们的mib文件,大概有20%的,Pysnmp不能成功读取,报错如下:
# build-pysnmp-mib -o fsp150cm-sa.mib.txt fsp150cm-sa.mib
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
WARNING: empty MIB module name seen in smidump output at CM-SA-MIB
Traceback (most recent call last):
File "/usr/bin/libsmi2pysnmp", line 5, in
pkg_resources.run_script('pysnmp==4.2.1', 'libsmi2pysnmp')
smidump -k -f python fsp150cm-sa.mib | /usr/bin/libsmi2pysnmp fails
make sure you are using libsmi version > 0.4.5 (or svn)
This isn't so much an answer as much as me sharing my experience testing these libraries.
* Could pull down 11958 oids/sec on the quad core test box.
* Didn't consume a lot of CPU. Seemed to be waiting on network I/O most of the time (keep reading).
* Came in at 5560 oids/sec on the same box.
* Very CPU intensive. I attribute this to the packet parsing being done in python.
* MIB lookups I thought were really nice.
可见pysnmp强在mib解析等方面,性能方面不能和netsnmp媲美。既然我们的mib pysnmp无法解析,只好放弃,期待pysnmp尽快开发出自己的好的mib解析器。只有选择netsnmp。
oid = netsnmp.Varbind('1.3.6.1.4.1','2544.1.12.2.1.10.1.0')
oidList = netsnmp.VarList(oid)
resultList = netsnmp.snmpget(oid ,Version=2,DestHost='172.23.192.44',Community='private')
session = netsnmp.Session(Version=2,DestHost='172.23.192.44',Community='private')
oid = netsnmp.Varbind('1.3.6.1.4.1','2544.1.12.2.1.10.1.0',2,'INTEGER')
oidList = netsnmp.VarList(oid)
resultList = session.get(oidList)
oid = netsnmp.Varbind('1.3.6.1.4.1','2544.1.12.2.1.10.1.0')
oid1 = netsnmp.Varbind('1.3.6.1.4.1.2544.1.12.8.1.1.1.5','1.1.1.1','15','INTEGER')
resultList = netsnmp.snmpget(oid ,oid1,Version=2,DestHost='172.23.192.44',Community='private')
session = netsnmp.Session(Version=2,DestHost='172.23.192.44',Community='private')
oid2 = netsnmp.Varbind('1.3.6.1.4.1','2544.1.12.2.1.10.1.0',2,'INTEGER')
oid3 = netsnmp.Varbind('.1.3.6.1.4.1.2544.1.12.8.1.1.1.5','1.1.1.1',20,'INTEGER')
oidList = netsnmp.VarList(oid3,oid2)
resultList = session.get(oidList)
oid = netsnmp.Varbind('1.3.6.1.4.1.2544.1.12.2.1.10.1','0','2','INTEGER')
oid1 = netsnmp.Varbind('1.3.6.1.4.1.2544.1.12.8.1.1.1.5','1.1.1.1','15','INTEGER')
resultList =netsnmp.snmpset(oid, oid1,Version=2,DestHost='172.23.192.44',Community='private')
通过tcpdump抓包分析,snmpset多个值也发送了一次请求,因此多个set集合在一起发送,会明显提高效率。
def __init__(self, tag=None, iid=None, val=None, type=None):
session = netsnmp.Session(Version=2,DestHost='172.23.192.44',Community='private')
oid2 = netsnmp.Varbind('1.3.6.1.4.1','2544.1.12.2.1.10.1.0',2,'INTEGER')
oid3 = netsnmp.Varbind('.1.3.6.1.4.1.2544.1.12.8.1.1.1.5','1.1.1.1',20,'INTEGER')
oidList = netsnmp.VarList(oid3,oid2)
resultList = session.set(oidList)
通过snmptranslate -Tso >toid.txt可以导出tid和oid的对应表。
通过snmptranslate –Td 可以获取oid的详细定义。
# snmptranslate -Td.1.3.6.1.4.1.2544.1.12.2.1.10.1
CM-SYSTEM-MIB::ntpClientEnabled
-- TEXTUAL CONVENTION TruthValue
SYNTAX INTEGER {true(1), false(2)}
DESCRIPTION "This allows to enable/disable the NTP client."
{ntpClientEnabled:.1.3.6.1.4.1.2544.1.12.2.1.10.1}
{ ntpClientEnabled:{ true:1, false:2}}
# Function: Ssh to remote server
def producer(sequence, input_p):
result = subprocess.check_output(['snmptranslate', '-Td',oid])
time.sleep(random.randint(1,8))
result = subprocess.check_output(['snmptranslate', '-Td',oid])
syntaxLine = syntax.search(result)
syntaxLine = syntaxLine.group(1)
valueitems = items.findall(syntaxLine)
snmpValueDict[tid] = dict(valueitems)
syntax = re.compile(r'^ SYNTAX.*?\{(.*?)\}',re.MULTILINE)
items = re.compile('(\w*)\((\w*)\)')
f = open ("snmpValueDict.txt",'w')
for line in open("tid_oid.txt"):
tid, oid = line.strip().split(',')
pickle.dump(snmpValueDict, open("snmpTidOid.txt", "w"))
print "length of snmpDict:" + str(len(snmpDict))
(output_p, input_p) = multiprocessing.Pipe()
t =multiprocessing.Process(target=consumer,args=(lock,(output_p, input_p),))
sequence = snmpDict.values() + [None]*p_num
producer(snmpDict.keys(), input_p)
pickle.dump(snmpValueDict, open("snmpValueDict.txt", "w"))
print "length of snmpDict:" + str(len(snmpDict))
print "length of snmpValueDict:" + str(len(snmpValueDict))
以上也是一个多进程程序的演示,如果mib的oid超过1000条,建议采用如下脚本来提取:
# Function: Ssh to remote server
for line in open("tid_oid.txt"):
tid, oid = line.strip().split(',')
pickle.dump(snmpDict, open("snmpTidOid.txt", "w"))
for mibFile in glob.glob(r"/home/share/andrew/soft/mib/110/MIBs/*.mib"):
result = re.findall(r'(\w*)\s+OBJECT-TYPE SYNTAX\s+\w+\s\{(.*?\(\w\).*?)\}',text)
for dictName,values in result:
splitValues = re.findall('(\w+)\s*?\((\w+)\)',values)
typeDict[dictName] = dict(splitValues)
pickle.dump(snmpDict, open("typeDict.txt", "w"))
for mibFile in glob.glob(r"D:\soft\mib\110\MIBs\*.mib"):
for dictName,values in result:
splitValues = re.findall('(\w+)\s*?\((\w+)\)',values)
snmpValueDict[dictName] = dict(splitValues)
pickle.dump(snmpValueDict, open("snmpValueDict.txt", "w"))
现在就可以加载存储在文件中的字典,利用tid代替oid进行测试了。
# Function: Ssh to remote server
snmpTOidDict = pickle.load(open(r"snmpTidOid.txt"))
snmpValueDict = pickle.load(open(r"snmpValueDict.txt"))
print snmpValueDict['ntpClientEnabled']
oid1 = netsnmp.Varbind(snmpTOidDict['ecpaControlDuration'],'1.1.1.1','15','INTEGER')
resultList = netsnmp.snmpset(oid, oid1,Version=2,DestHost='172.23.192.44',Community='private')
CM-PROTECTION-MIB::cmFacProtGroupSwitchMode.1.1.1.1 = INTEGER: oneplusone(1)
CM-PROTECTION-MIB::cmFacProtGroupRowStatus.1.1.1.1 = INTEGER: createAndGo(4)
# Function: Ssh to remote server
snmpTOidDict = pickle.load(open(r"snmpTidOid.txt"))
snmpValueDict = pickle.load(open(r"snmpValueDict.txt"))
print snmpValueDict['cmFacProtGroupRowStatus']
oid = netsnmp.Varbind(snmpTOidDict['cmFacProtGroupSwitchMode'], '1.1.1.1',
snmpValueDict['cmFacProtGroupSwitchMode']['oneplusone'],'INTEGER')
oid1 = netsnmp.Varbind(snmpTOidDict['cmFacProtGroupWorkPort'], '1.1.1.1',
snmpTOidDict['cmEthernetNetPortIndex'] + '.1.1.1.1','OBJECTID')
oid2 = netsnmp.Varbind(snmpTOidDict['cmFacProtGroupProtPort'], '1.1.1.1',
snmpTOidDict['cmEthernetNetPortIndex'] + '.1.1.1.2','OBJECTID')
oid3 = netsnmp.Varbind(snmpTOidDict['cmFacProtGroupRowStatus'], '1.1.1.1',
snmpValueDict['cmFacProtGroupRowStatus']['createAndGo'],'INTEGER')
oid3 = netsnmp.Varbind(snmpTOidDict['cmFacProtGroupRowStatus'], '1.1.1.1',
snmpValueDict['cmFacProtGroupRowStatus']['destroy'],'INTEGER')
resultList = netsnmp.snmpset( oid3,Version=2,DestHost='172.23.192.44',Community='private')
当然上面这种调用方式,参数显得有点多,正式形成库时会再次封装。
session = netsnmp.Session(Version=2,DestHost='172.23.192.44',Community='private')
oid = netsnmp.Varbind('1.3.6.1.4.1.2544.1.12','',2,'INTEGER')
oidList = netsnmp.VarList(oid)
resultList = session.walk(oidList)
通过上述代码,执行time ./test.py 。walk的效率:耗时:5m38.919s oid个数:13385
平均秒只能获取约40个oid。和参考资料中测试得5560 oids/sec有百倍左右的差距。不过我们的设备已经吃到近90%的cpu,这部分有待以后继续研究优化。
python snmp 自动化2-在python中使用snmp相关推荐
- python 打印机自动化_用Python实现定时自动化收取蚂蚁森林能量,再也不怕被偷了...
1. 概述 提到蚂蚁森林,大家应该都知道,你是否有因忘记收取能量而被好友收取的经历呢? 如果你不是蚂蚁森林重度用户,被别人收取了能量可能对你来说没什么. 但如果你是蚂蚁森林重度用户,遇到能量被偷 .. ...
- python报表自动化系列 - 在Windows中打开指定目录
python在Windows系统中打开指定目录(文件夹) 李俊才 邮箱:291148484@163.com [函数说明] 该函数可以在windows系统中打开指定的文件夹,参数path应为字符串形式表 ...
- 用python做自动化控制-用 Python 自动化办公能做到哪些有趣或有用的事情?
首先,我是一名数据分析师-- But,我还有一项短信资源管理的工作,从收集各部门需求开始,到检查文案策略等,最后在系统上创建,整个流程每天都要重复进行3-4个小时,工作特别繁琐而缺乏技术性,不过这个工 ...
- python android自动化基于java_Appium+Python自动化 1 环境搭建(适用windows系统-Android移动端自动化)...
一.安装并配置 java jdk ①下载 java jdk后 安装,安装完成后,配置环境变量 打开计算机->系统属性->高级系统设置->环境变量->新建(系统变量),如图所示: ...
- python流程自动化_基于Python的SAP流程自动化
财务的自我修养,微信公众号:机智出品(jizhjchupin),文中各类数据文件均可于公众号内下载 痛点:SAP部分业务操作重复化.规律化: 目标:无意义的重复无脑操作全部自动化: 工具:Python ...
- python 手机自动化脚本_iOS python自动化出包脚本
脚本代码如下: #!/usr/bin/python # -*- coding:UTF-8 -*- import os import sys import time # 发邮件所用 from email ...
- python报表自动化系列 - 通过Python使用MySQL数据库
通过Python使用MySQL数据库实例 李俊才 邮箱:291148484@163.com [函数说明] 如调用本函数,必须先安装有MySQL数据库软件,并已经建立了某个数据库,然后方可使用本函数对已 ...
- python手机自动化命令_Appium+Python实现自动化登录
#Appium+Python实现自动化测试 Appium简介 官方的概述为: Appium is an open source test automation framework for use wi ...
- 虫师JAVA接口自动化pdf下载,2019虫师自动化 Python接口自动化虫师 robotframework虫师 虫师接口自动化源码下载...
第一套:Python虫师自动化 [5.1G] ┃ ┣━━Python接口测试 [2.7G] ┃ ┃ ┣━━code [23.9K] ┃ ┃ ┃ ┗━━myweb01.zip [23.9K] ┃ ┃ ┣ ...
- 虫师 python_2019虫师自动化 Python接口自动化虫师 robotframework虫师 虫师接口自动化源码下载...
第一套:Python虫师自动化 [5.1G] ┃ ┣━━Python接口测试 [2.7G] ┃ ┃ ┣━━code [23.9K] ┃ ┃ ┃ ┗━━myweb01.zip [23.9K] ┃ ┃ ┣ ...
最新文章
- CentOS 编译 openjdk
- SSH异常“Failed to start OpenSSH Server daemon”问题排查
- c语言设备管理系统实训答辩,C语言设计(力学实验设备管理系统)1答辩.doc
- 自己动手实现的 Spring IOC 和 AOP - 下篇
- LwIP编译方法以及选项说明
- pthread_cond_t
- mysql 大小端_go语言中大小端模式的个人理解
- springmvc项目在启动完成之后执行一次方法_SpringMVC源码分析
- attrib批量显示文件夹_CMD中使用attrib命令设置文件只读、隐藏属性详解
- python session过期_python session过期timeout处理
- win10前置耳机插孔没声音_win10头戴式耳机麦克风没声音怎么办
- 信用风险计量模型简述
- 在智慧城市建设中 计算机模拟是一个强大的工具
- 长微博图片制作(无水印)
- 什么叫能力不行,什么叫术业有专攻
- 将应用在最近应用中隐藏
- 智和网管平台国产化解决方案
- 【NLP】文本处理的基本方法(超详解)
- 温故而知识--历史清单
- 淘宝迪士尼抢购脚本 无需修改代码 只需要修改抢购时间 附上安装教程