Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 pysnmp无法从不同的计算机接收陷阱_Python 2.7_Pysnmp - Fatal编程技术网

Python 2.7 pysnmp无法从不同的计算机接收陷阱

Python 2.7 pysnmp无法从不同的计算机接收陷阱,python-2.7,pysnmp,Python 2.7,Pysnmp,我使用VM IP eth0-192.168.12.20来接收陷阱通知,而不是本地主机IP。如果从VMI外部生成陷阱,我不会接收任何陷阱。我使用来自另一台机器的snmptrap命令,但在VM接口eth0上执行tcpdump时,我可以看到SNMP数据。 若我使用snmptrap命令从同一台机器生成陷阱,我可以通过PySNMP陷阱接收器脚本查看陷阱数据 选项已尝试: 1.尝试将端口绑定到0.0.0.0以从任何计算机接收陷阱 2.在pysnmp中启用了调试选项,以了解如何解决该问题。从外部计算机发送sn

我使用VM IP eth0-192.168.12.20来接收陷阱通知,而不是本地主机IP。如果从VMI外部生成陷阱,我不会接收任何陷阱。我使用来自另一台机器的snmptrap命令,但在VM接口eth0上执行tcpdump时,我可以看到SNMP数据。 若我使用snmptrap命令从同一台机器生成陷阱,我可以通过PySNMP陷阱接收器脚本查看陷阱数据

选项已尝试: 1.尝试将端口绑定到0.0.0.0以从任何计算机接收陷阱 2.在pysnmp中启用了调试选项,以了解如何解决该问题。从外部计算机发送snmptrap时没有生成任何信息

与我的问题类似的是,下面的链接没有最终的解决方案

代码: SNMP v1和v2c:

from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp.carrier.asynsock.dgram import udp, udp6
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
from pysnmp.entity import engine, config
from pysnmp.entity.rfc3413 import ntfrcv

from pysnmp import debug
debug.setLogger(debug.Debug("all"))

### SNMPv2c/SNMPv1 setup
### Callback function for receiving notifications
def v2cv1CallBackFunc(snmpEngine, stateReference, contextEngineId, contextName,
                      varBinds, cbCtx):
    transportDomain, transportAddress = snmpEngine.msgAndPduDsp.getTransportInfo(stateReference)
    print transportDomain, transportAddress
    # Get an execution context...
    execContext = snmpEngine.observer.getExecutionContext(
        'rfc3412.receiveMessage:request'
    )

    # ... and use inner SNMP engine data to figure out peer address
    print('Notification from %s, ContextEngineId "%s", ContextName "%s"'
                          %('@'.join([str(x) for x in execContext['transportAddress']]),
                            contextEngineId.prettyPrint(), contextName.prettyPrint()))

    for name, val in varBinds:
        print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))


# Create SNMP engine with autogenernated engineID and pre-bound
# to socket transport dispatcher
snmpEngine = engine.SnmpEngine()

# SNMPv1/2c setup
# SecurityName <-> CommunityName mapping
config.addV1System(snmpEngine, 'my-area', "public")

# Specify security settings per SecurityName (SNMPv2c -> 1)
config.addTargetParams(snmpEngine, 'my-creds', 'my-area', 'noAuthNoPriv', 1)

# Transport setup
# UDP over IPv4, first listening interface/port
config.addSocketTransport(
    snmpEngine,
    udp.domainName + (1, ),
    udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))
)

# Register SNMP Application at the SNMP engine
ntfrcv.NotificationReceiver(snmpEngine, v2cv1CallBackFunc)

snmpEngine.transportDispatcher.jobStarted(1)  # this job would never finish

# Run I/O dispatcher which would receive queries and send confirmations
try:
    snmpEngine.transportDispatcher.runDispatcher()
except:
    snmpEngine.transportDispatcher.closeDispatcher()
    raise

提前感谢

在IT团队的帮助下,我发现了这个问题。基本上,API工作正常

firewalld应用程序不允许数据包通过。因此,在我将SNMP端口添加到防火墙例外列表后,它使我的代码正常工作

我使用的命令:

sudo firewall cmd-添加端口=161-162/udp-区域=公共-永久 sudo systemctl重新启动网络 sudo systemctl重新加载防火墙d