Interface d'appel SNMP encapsulée Python

Lyshark 2022-07-23 20:28:17 阅读数:948

interfaceappelsnmpencapsulpython

PySNMP C'est une utilisation purePythonRéaliséSNMP,AvecPySNMPLe plus abstraitAPIPourOne-line Applications,Il y a deux types deAPI:Synchrone et asynchrone,Tout est dans le module.pysnmp.entity.rfc3413.oneliner.cmdgen Réalisation intermédiaire,VoiciGetModalités etWalkMise en œuvre de base de la méthode.

Il faut d'abord l'installer dans le systèmeSNMPClient,PourLinuxPour la plateforme, il suffit d'effectuer le processus de configuration suivant.

[[email protected] ~]# yum install -y net-snmp
[[email protected] ~]# 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
[[email protected] ~]# systemctl restart snmpd
[[email protected] ~]# systemctl enable snmpd

Si ouiWindows Le système doit être sur la liste des services à la clientèle ,OuvertSNMPSoutien, Et définissez un nom de groupe ,Comme le montre la figure ci - dessous:.

Une fois le client configuré , Le serveur a obtenu des données pour le client ,Nous prenonsOID Exemple de numéro de série , Nous demandons le nom correspondant à un numéro de série spécifique ,Et l'enregistrer,Par exemple:.

C:\Users\admin> 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

D'abord, on n'utilise pas PySNMP Le module ouvre directement l'appel thread pour voir ,Ce code est le suivant:.

import os,re,time
# AdoptionSNMP Collecter les hôtes CPUTaux d & apos; utilisation: AdoptionSNMPAccord, Collecte de CPUTaux d & apos; utilisation(Pourcentage),Et revenir àJSONString.
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
# AdoptionSNMPAccès au systèmeCPUInformations sur la charge: Obtenir le système séparément 1,5,15Informations sur la charge en minutes,Et revenir àJSONFormat.
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
# AdoptionSNMP Obtenir l'utilisation de la mémoire du système : Utilisation de la mémoire,Après l'avoir obtenu, Convertir en format dictionnaire pour enregistrer .
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
# AdoptionSNMP Obtenir les données du disque système : Ce cas n'est pas complet , J'ai juste écrit un peu , Il y a un problème qui n'a jamais été résolu .
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)

Nous utilisonspysnmpModule pour faire,InstallationpysnmpC'est simple.,Exécuter les commandespip install pysnmp C'est tout., Les données cibles peuvent être obtenues après l'installation en utilisant le code suivant , Il existe deux façons d'obtenir GetL'autre estWalk.

from pysnmp.hlapi import *
import os,sys
class NetSNMP():
def __init__(self,address,region):
self.region = region
self.address = address
# Méthode d'obtention des données spécifiées
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]
# UtiliserWalkExtraire les données
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__":
# Initialisation
ptr = NetSNMP("192.168.81.130","public")
# UtiliserGETComment obtenirOIDDonnées
ret = ptr.GetNumber("HOST-RESOURCES-MIB","hrMemorySize",0)
print("Type: {} --> Retour aux résultats: {} --> Analyse: {}".format(type(ret),ret,ret[1]))
# UtiliserWalkComment obtenirOIDDonnées
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("Interface de carte réseau: {}".format(mac))
Copyright:Cet article est[Lyshark]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/204/202207231957165909.html