Python封裝SNMP調(diào)用接口得示例代碼

    PySNMP 是一個(gè)純粹用Python實(shí)現(xiàn)得SNMP,用PySNMP得最抽象得API為One-line Applications,其中有兩類API:同步得和非同步得,都在模塊pysnmp.entity.rfc3413.oneliner.cmdgen 中實(shí)現(xiàn),如下是Get方式與Walk方式得基本實(shí)現(xiàn).

    首先需要在系統(tǒng)中安裝SNMP客戶端,對(duì)于Linux平臺(tái)來(lái)說(shuō)只需要執(zhí)行如下配置過(guò)程即可.

    [root@localhost ~]# yum install -y net-snmp[root@localhost ~]# cat /etc/snmp/snmpd.conf |grep -vE "^#|^$"com2sec notConfigUser  default       publicgroup   notConfigGroup v1           notConfigUsergroup   notConfigGroup v2c           notConfigUserview    systemview    included   .1view    systemview    included   .1access  notConfigGroup  ""  any  noauth  exact  systemview none none[root@localhost ~]# systemctl restart snmpd[root@localhost ~]# systemctl enable snmpd

    如果是Windows系統(tǒng)則需要在客戶機(jī)服務(wù)列表,開(kāi)啟SNMP支持,并設(shè)置好一個(gè)團(tuán)體名稱,如下圖。

    當(dāng)我們配置好客戶端后,服務(wù)端就客戶獲取數(shù)據(jù)了,我們以一個(gè)OID序號(hào)為例,我們查詢特定序號(hào)對(duì)應(yīng)得名稱,然后將其記錄下來(lái),例如下面這樣。

    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模塊直接開(kāi)線程調(diào)用看看,該代碼如下所示.

    import os,re,time# 通過(guò)SNMP收集主機(jī)CPU利用率: 通過(guò)SNMP協(xié)議,收集目標(biāo)主機(jī)得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# 通過(guò)SNMP獲取系統(tǒng)CPU負(fù)載信息: 分別獲取到系統(tǒng)得1,5,15分鐘得負(fù)載信息,并返回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# 通過(guò)SNMP獲取系統(tǒng)內(nèi)存占用: 內(nèi)存利用率,獲取到之后,將其轉(zhuǎn)化為字典格式保存。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# 通過(guò)SNMP獲取系統(tǒng)磁盤數(shù)據(jù): 這個(gè)案例并不完整,我只寫(xiě)了一點(diǎn),后面有個(gè)問(wèn)題一直沒(méi)有解決.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 0if __name__ == '__main__':    for i in range(100):        dic = Get_CPU_Info("192.168.1.20")        print(dic)        time.sleep(1)

    我們使用pysnmp模塊來(lái)做,安裝pysnmp很簡(jiǎn)單,執(zhí)行命令pip install pysnmp 即可,安裝后使用以下代碼執(zhí)行即可獲取到目標(biāo)數(shù)據(jù),獲取方式分為兩種一種為Get另一種為Walk.

    from pysnmp.hlapi import *import os,sysclass NetSNMP():    def __init__(self,address,region):        self.region = region        self.address = address    # 獲取指定數(shù)據(jù)得方法    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拉取數(shù)據(jù)    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 resif __name__ == "__main__":    # 初始化    ptr = NetSNMP("192.168.81.130","public")    # 使用GET方式獲取OID數(shù)據(jù)    ret = ptr.GetNumber("HOST-RESOURCES-MIB","hrMemorySize",0)    print("類型: {} --> 返回結(jié)果: {} --> 解析: {}".format(type(ret),ret,ret[1]))    # 使用Walk方式獲取OID數(shù)據(jù)    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("網(wǎng)卡接口: {}".format(mac))

    以上就是Python封裝SNMP調(diào)用接口得示例代碼得詳細(xì)內(nèi)容,更多關(guān)于Python SNMP調(diào)用接口得資料請(qǐng)關(guān)注之家其它相關(guān)內(nèi)容!

    聲明:所有內(nèi)容來(lái)自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
    發(fā)表評(píng)論
    更多 網(wǎng)友評(píng)論1 條評(píng)論)
    暫無(wú)評(píng)論

    返回頂部

    主站蜘蛛池模板: 亚洲中文字幕一区精品自拍| 国产伦精品一区二区三区女| 久久精品无码一区二区三区免费 | 久久精品一区二区三区资源网| 精品少妇人妻AV一区二区 | 中文字幕无码一区二区三区本日| 亚洲熟妇AV一区二区三区浪潮| 国产精品美女一区二区| 国产香蕉一区二区三区在线视频 | 一区二区在线视频观看| 中文字幕一区二区三匹| 精品免费国产一区二区| 春暖花开亚洲性无区一区二区| 精品一区二区三区自拍图片区| 日本韩国一区二区三区| 午夜影院一区二区| 无码中文字幕人妻在线一区二区三区| 中文国产成人精品久久一区| 久久中文字幕无码一区二区| 精品无码av一区二区三区| 无码国产精品一区二区免费式直播| 高清国产AV一区二区三区| 色妞色视频一区二区三区四区| 中文人妻无码一区二区三区 | 国产伦精品一区二区三区四区| 日韩精品免费一区二区三区 | 少妇人妻精品一区二区三区| 国产精品福利一区二区| 国产成人久久一区二区三区 | 精品人妻无码一区二区色欲产成人| 无码精品不卡一区二区三区| 中文字幕精品一区影音先锋| 中文字幕一区二区免费| 国产AⅤ精品一区二区三区久久| 麻豆AV天堂一区二区香蕉| 糖心vlog精品一区二区三区| 无码AV天堂一区二区三区| 国产午夜精品一区理论片| 精品久久久久一区二区三区 | 国产在线aaa片一区二区99| 无码人妻精品一区二区三区久久久 |