<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
PySNMP 是一個純粹用Python實現的SNMP,用PySNMP的最抽象的API為One-line Applications,其中有兩類API:同步的和非同步的,都在模組pysnmp.entity.rfc3413.oneliner.cmdgen 中實現,如下是Get方式與Walk方式的基本實現.
首先需要在系統中安裝SNMP使用者端,對於Linux平臺來說只需要執行如下設定過程即可.
[root@localhost ~]# yum install -y net-snmp [root@localhost ~]# cat /etc/snmp/snmpd.conf |grep -vE "^#|^$" com2sec notConfigUser default public group notConfigGroup v1 notConfigUser group notConfigGroup v2c notConfigUser view systemview included .1 view systemview included .1 access notConfigGroup "" any noauth exact systemview none none [root@localhost ~]# systemctl restart snmpd [root@localhost ~]# systemctl enable snmpd
如果是Windows系統則需要在客戶機服務列表,開啟SNMP支援,並設定好一個團體名稱,如下圖。
當我們設定好使用者端後,伺服器端就客戶獲取資料了,我們以一個OID序號為例,我們查詢特定序號對應的名稱,然後將其記錄下來,例如下面這樣。
C:Usersadmin> snmpwalk -v 2c -c public 192.168.1.101 .1.3.6.1.2.1.25.2.2
HOST-RESOURCES-MIB::hrMemorySize.0 = INTEGER: 2096632 KBytes
首先我們不使用PySNMP模組直接開執行緒呼叫看看,該程式碼如下所示.
import os,re,time # 通過SNMP收集主機CPU利用率: 通過SNMP協定,收集目標主機的CPU利用率(百分比),並返回JSON字串. def Get_CPU_Info(addr): try: Head = ["HostName","CoreLoad","CpuUser","CpuSystem","CpuIdle"] CPU = [] ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " .1.3.6.1.2.1.1.5") CPU.append(ret.read().split(":")[3].strip()) ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " .1.3.6.1.2.1.25.3.3.1.2") CPU.append(ret.read().split(":")[3].strip()) for i in [9,10,11]: ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " 1.3.6.1.4.1.2021.11.{}.0".format(i)) ret = ret.read() Info = ret.split(":")[3].strip() CPU.append(Info) return dict(zip(Head,CPU)) except Exception: return 0 # 通過SNMP獲取系統CPU負載資訊: 分別獲取到系統的1,5,15分鐘的負載資訊,並返回JSON格式. def Get_Load_Info(addr): try: Head = ["HostName","Load1","Load5","Load15"] SysLoad = [] ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " .1.3.6.1.2.1.1.5") SysLoad.append(ret.read().split(":")[3].strip()) ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " .1.3.6.1.4.1.2021.10.1.3") load = list(re.sub(".*STRING: ", "", ret.read()).split("n")) SysLoad.append(load[0]) SysLoad.append(load[1]) SysLoad.append(load[2]) return dict(zip(Head,SysLoad)) except Exception: return 0 # 通過SNMP獲取系統記憶體佔用: 記憶體利用率,獲取到之後,將其轉化為字典格式儲存。 def Get_Mem_Info(addr): try: Head = ["HostName","memTotalSwap","memAvailSwap","memTotalReal","memTotalFree"] SysMem = [] ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " .1.3.6.1.2.1.1.5") SysMem.append(ret.read().split(":")[3].strip()) ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " .1.3.6.1.4.1.2021.4") mem = ret.read().split("n") for i in [2,3,4,6]: SysMem.append(re.sub(".*INTEGER: ","",mem[i]).split(" ")[0]) return dict(zip(Head,SysMem)) except Exception: return 0 # 通過SNMP獲取系統磁碟資料: 這個案例並不完整,我只寫了一點,後面有個問題一直沒有解決. def Get_Disk_Info(addr): try: dic = {} list = [] ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " HOST-RESOURCES-MIB::hrStorageDescr") DiskName = ret.read().split("n") ret =os.popen("snmpwalk -v 2c -c nmap " + addr + " HOST-RESOURCES-MIB::hrStorageUsed") DiskUsed = ret.read().split("n") ret = os.popen("snmpwalk -v 2c -c nmap " + addr + " HOST-RESOURCES-MIB::hrStorageSize") DiskSize = ret.read().split("n") for i in range(1,len(DiskName) - 7): dic["Name"]= DiskName[i + 5].split(":")[3] dic["Used"]= DiskUsed[i + 5].split(":")[3] dic["Size"]= DiskSize[i + 5].split(":")[3] list.append(dic) return list except Exception: return 0 if __name__ == '__main__': for i in range(100): dic = Get_CPU_Info("192.168.1.20") print(dic) time.sleep(1)
我們使用pysnmp模組來做,安裝pysnmp很簡單,執行命令pip install pysnmp
即可,安裝後使用以下程式碼執行即可獲取到目標資料,獲取方式分為兩種一種為Get另一種為Walk.
from pysnmp.hlapi import * import os,sys class NetSNMP(): def __init__(self,address,region): self.region = region self.address = address # 獲取指定資料的方法 def GetNumber(self,oid,sub_oid,sub_id): iterator = getCmd(SnmpEngine(), CommunityData(self.region), UdpTransportTarget((self.address, 161)), ContextData(), ObjectType(ObjectIdentity(oid, sub_oid, sub_id))) errorIndication, errorStatus, errorIndex, varBinds = next(iterator) if errorIndication: return False else: if errorStatus: return False else: for varBind in varBinds: return [x.prettyPrint() for x in varBind] # 使用Walk拉取資料 def WalkNumber(self, oid): res = [] for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(SnmpEngine(), CommunityData(self.region),UdpTransportTarget((self.address, 161)),ContextData(), ObjectType(ObjectIdentity(oid)).addMibSource( './site-packages/pysnmp/smi/mibs','pysnmp_mibs'),lexicographicMode=False): if errorIndication: print(errorIndication, file=sys.stderr) break elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr) break else: for varBind in varBinds: res.append(str(varBind)) return res if __name__ == "__main__": # 初始化 ptr = NetSNMP("192.168.81.130","public") # 使用GET方式獲取OID資料 ret = ptr.GetNumber("HOST-RESOURCES-MIB","hrMemorySize",0) print("型別: {} --> 返回結果: {} --> 解析: {}".format(type(ret),ret,ret[1])) # 使用Walk方式獲取OID資料 ret = ptr.WalkNumber(".1.3.6.1.2.1.2.2.1.6") for each in ret: mac = each.split("=")[1] if len(mac) > 1: print("網路卡介面: {}".format(mac))
以上就是Python封裝SNMP呼叫介面的範例程式碼的詳細內容,更多關於Python SNMP呼叫介面的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45