2013-04-25 80 views
3

我需要Python中的SNMP代理,该监听某个端口上并响应SNMP的基本命令(如GTE,SET,GETNEXT ...等)SNMP代理在Python

如果任何一个有代码,请回复此帖。

+0

[pysnmp command responder](http://pysnmp.sourceforge.net/examples/current/v3arch/agent/cmdrsp/v3-multiple-users.html)和[查看zabbix的nullege源代码](http: //www.nullege.com/codes/show/src%40z%40a%40zabbixSNMP-creator-HEAD%40src%40zabbixsnmp_creator.py/34/pysnmp/python)。 pysnmp命令响应代码将像魅力一样工作 – 2013-04-25 11:39:24

+0

我检查了Command Responder脚本,但我的目标是从txt文件中读取OID并回复get/getnext等请求。如果设置请求来了,那么它应该在文件中写入OID。我没有得到命令响应者如何读取OID以及从哪里获取 – aloksinghk 2013-04-29 06:04:26

+0

[请仔细阅读示例](http://pysnmp.sourceforge.net/examples/current/v3arch/agent/cmdrsp/v2c-custom-scalar-mib -objects.html),其中MIB由'mibBuilder.importSymbols('SNMP-V2-SMI')加载'。 – 2013-04-29 13:00:25

回答

-1
import socket 
import netsnmp 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 
s.bind((HOST, PORT)) #give host ip and port no: 
s.listen(2) 

conn, addr = s.accept() 
data = conn.recv(1024) 
bindvariable = netsnmp.Varbind("give full oid here") 
xx = netsnmp.snmpget(bindvariable, Version = 2, DestHost = '192.168.0.216', Community='private') 

同样可以使用snmpset也走

+1

这似乎有点混乱。我不是Python程序员,但上面的代码似乎是 1.打开TCP套接字 2.发送SNMP获取请求 这两者都不与SNMP代理相关。请在阅读相关问题之前阅读相关的RFC(例如1905)以开发一些基本的SNMP知识。 – Jolta 2013-06-13 08:08:53

3

那里pysnmp web-site的SNMP命令响应脚本的集合。

下面是一个简单的基于PySNMP的命令响应程序,它使用/ tmp中的文本文件作为MIB数据存储。

from pysnmp.entity import engine, config 
from pysnmp.entity.rfc3413 import cmdrsp, context 
from pysnmp.carrier.asynsock.dgram import udp 
from pysnmp.smi import instrum, error 
from pysnmp.proto.api import v2c 

snmpEngine = engine.SnmpEngine() 

config.addSocketTransport(
    snmpEngine, 
    udp.domainName, 
    udp.UdpTransport().openServerMode(('127.0.0.1', 1161)) 
) 

config.addV1System(snmpEngine, 'my-area', 'public', contextName='my-context') 

config.addVacmUser(snmpEngine, 2, 'my-area', 'noAuthNoPriv', (1,3,6), (1,3,6)) 

snmpContext = context.SnmpContext(snmpEngine) 

class FileInstrumController(instrum.AbstractMibInstrumController): 
    def readVars(self, vars, acInfo=(None, None)): 
     try: 
      return [ (o,v2c.OctetString(open('/tmp/%s.txt' % o, 'r').read())) for o,v in vars ] 
     except IOError: 
      raise error.SmiError 

    def writeVars(self, vars, acInfo=(None, None)): 
     try: 
      for o,v in vars: 
       open('/tmp/%s.txt' % o, 'w').write(str(v)) 
      return vars 
     except IOError: 
      raise error.SmiError 

snmpContext.registerContextName(
    v2c.OctetString('my-context'),   # Context Name 
    FileInstrumController()     # Management Instrumentation 
) 

cmdrsp.GetCommandResponder(snmpEngine, snmpContext) 
cmdrsp.SetCommandResponder(snmpEngine, snmpContext) 

snmpEngine.transportDispatcher.jobStarted(1) 

try: 
    snmpEngine.transportDispatcher.runDispatcher() 
except: 
    snmpEngine.transportDispatcher.closeDispatcher() 
    raise 

请记住,这个脚本只是一个初学者,它并不处理一些特殊情况。

+0

我检查了Command Responder脚本,但我的目标是从txt文件读取OID并回复get/getnext等请求。如果设置请求来了,那么它应该在文件中写入OID。我没有得到命令响应者如何读取OID和从哪里读取。 – aloksinghk 2013-04-29 06:01:20

+0

上面的脚本将值写入以OID命名的文本文件中(在/ tmp中),并从GET处读取值。这发生在readVars()和writeVars()方法中。 – 2013-05-06 14:19:51