5

我需要 python 中的 SNMP 代理,它侦听特定端口并响应基本 SNMP 命令(如 GTE、SET、GETNEXT ...等)

如果有人有代码,请回复此帖子。

4

2 回答 2

4

在pysnmp 网站上有一组 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

请记住,此脚本只是您的入门,它不处理一些极端情况。

于 2013-04-25T13:49:25.727 回答
-2
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 和 walk

于 2013-04-25T12:03:35.017 回答