我使用以下简单脚本:
from pysnmp.entity.rfc3413.oneliner import cmdgen
errorIndication, errorStatus, errorIndex, \
varBindTable = cmdgen.CommandGenerator().bulkCmd(
cmdgen.CommunityData('test-agent', 'public'),
cmdgen.UdpTransportTarget(('IP.IP.IP.IP', 161)),
0,
1,
(1,3,6,1,2,1,4,24,4,1,2,169,254)
)
if errorIndication:
print errorIndication
else:
if errorStatus:
print '%s at %s\n' % (
errorStatus.prettyPrint(),
errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
)
else:
for varBindTableRow in varBindTable:
for name, val in varBindTableRow:
print '%s = %s' % (name.prettyPrint(), val.prettyPrint())
Run Code Online (Sandbox Code Playgroud)
从命令行使用snmpwalk到此设备返回预期结果.但脚本返回超时之前未收到SNMP响应.如果我省略这个OID,那么一切正常.所以问题在于这个OID
这里tcpdump统计:
/usr/sbin/tcpdump -nn -vv -s0 -A host HOST and udp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:15:31.494920 …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个脚本来在我的设备上执行 GET/SET 命令。当我尝试对 sysDescr(它是标准 MIB SNMPv2 的一部分)执行 GET 操作时,我设法得到了响应。我尝试以几种不同的方式使用 mibdump.py 脚本,以便转换我的专有 MIB 文件,以便我以后可以使用它们:
使用 .mib 扩展名激活特定 MIB 文件(见结果)上的 mibdump.py
c:\Program Files\Python35\Scripts>python mibdump.py SL-XPDR.mib
Source MIB repositories: file:///usr/share/snmp/mibs, h ttp://mibs.snmplabs.com/a
sn1/@mib@
Borrow missing/failed MIBs from: h ttp://mibs.snmplabs.com/pysnmp/notexts/@mib@
Existing/compiled MIB locations: pysnmp.smi.mibs, pysnmp_mibs
Compiled MIBs destination directory: C:\Users\alpha_2.PL\PySNMP Configuration\mibs
MIBs excluded from code generation: RFC-1212, RFC-1215, RFC1065-SMI, RFC1155-SMI
, RFC1158-MIB, RFC1213-MIB, SNMP-FRAMEWORK-MIB, SNMP-TARGET-MIB, SNMPv2-CONF, SN
MPv2-SMI, SNMPv2-TC, SNMPv2-TM, TRANSPORT-ADDRESS-MIB
MIBs to compile: SL-XPDR
Destination format: pysnmp
Parser grammar cache directory: not used …Run Code Online (Sandbox Code Playgroud)我想通过使用 python pysnmp 模块获取 snmp 数据。我曾经使用命令行来获取 SNMP 数据,但现在我想使用 pysnmp 模块来读取它。
SNMP命令-
snmpwalk -v 1 -c public <ip address>:<port> xyz::pqr
Run Code Online (Sandbox Code Playgroud)
我正在使用像上面这样的命令。现在我尝试了类似下面的东西 -
import netsnmp
def getmac():
oid = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.2.1.17.7.1.2.2.1.2'))
res = netsnmp.snmpgetbulk(oid, Version = 1, DestHost='ip',
Community='pub')
return res
print getmac()
Run Code Online (Sandbox Code Playgroud)
我遇到错误 -导入 netsnmp。没有模块 netsnmp
任何人都可以给我建议如何使用 python 从 snmp 服务器获取 snmp 数据?
我想重现以下 SNMP 命令的行为:
snmpwalk -v2c -cpublic 192.168.0.10 1.3.6.1.2.1.25.2.3.1.3
Run Code Online (Sandbox Code Playgroud)
这给了我这个输出:
iso.3.6.1.2.1.25.2.3.1.3.1 = STRING: "Physical memory"
iso.3.6.1.2.1.25.2.3.1.3.3 = STRING: "Virtual memory"
iso.3.6.1.2.1.25.2.3.1.3.6 = STRING: "Memory buffers"
iso.3.6.1.2.1.25.2.3.1.3.7 = STRING: "Cached memory"
iso.3.6.1.2.1.25.2.3.1.3.8 = STRING: "Shared memory"
iso.3.6.1.2.1.25.2.3.1.3.10 = STRING: "Swap space"
iso.3.6.1.2.1.25.2.3.1.3.31 = STRING: "/"
iso.3.6.1.2.1.25.2.3.1.3.37 = STRING: "/run"
iso.3.6.1.2.1.25.2.3.1.3.39 = STRING: "/dev/shm"
iso.3.6.1.2.1.25.2.3.1.3.40 = STRING: "/run/lock"
iso.3.6.1.2.1.25.2.3.1.3.41 = STRING: "/sys/fs/cgroup"
iso.3.6.1.2.1.25.2.3.1.3.59 = STRING: "/tmp"
iso.3.6.1.2.1.25.2.3.1.3.60 = STRING: "/run/cgmanager/fs"
iso.3.6.1.2.1.25.2.3.1.3.61 = STRING: "/run/user/112"
iso.3.6.1.2.1.25.2.3.1.3.63 = STRING: "/run/user/0"
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这个代码:
#!/usr/bin/env python3
from pysnmp.hlapi …Run Code Online (Sandbox Code Playgroud) 大家好我正在寻找一个解决方案,以同时获得多个oid.例如,是否可以在pysnmp get命令生成器中使用oid列表?
由此:
cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.bulkCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget(('demo.snmplabs.com', 161)),
0, 25,
'1.3.6.1.2.1.2.2.1.2',
'1.3.6.1.2.1.2.2.1.3',
)
Run Code Online (Sandbox Code Playgroud)
类似于:
myoid = ['1.3.6.1.2.1.1.1.0', '1.3.6.1.2.1.1.6.0', '1.3.6.1.2.1.1.6.0']
cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.bulkCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget(('demo.snmplabs.com', 161)),
0, 25,
myoids,
)
Run Code Online (Sandbox Code Playgroud)
实际的问题是oids是变量所以我正在寻找一种方法来轻松地改变它们.
我在Windows XP计算机上运行Python程序。运行程序时,出现以下错误:
File "C:\Python27\lib\pysnmp\smi\builder.pyt, line 230, in loadModules...
pysnmp.smi.error.SmiError: MIB file "SNMPv2-MIB.py[co]" not found in search path
Run Code Online (Sandbox Code Playgroud)
SNMPv2-MIB.py文件当前位于中C:\Python27\Lib\pysnmp\smi\mibs。有谁知道我该怎么解决?
我正在尝试在PySNMP中使用MIB文件.代码相当简单.没什么复杂的.只是试图在OID下获取信息.我正在使用的代码如下:
#!/usr/local/bin/python2.7
from pysnmp.smi import builder, view, error
from pysnmp.entity.rfc3413.oneliner import cmdgen
cmdGen = cmdgen.CommandGenerator()
mibBuilder = builder.MibBuilder()
mibPath = mibBuilder.getMibPath() + ( '/path/to/command/mibs', )
mibBuilder.setMibPath( *mibPath )
mibBuilder.loadModules(
'MIB-File',
)
mibView = view.MibViewController( mibBuilder )
errorIndication, errorStatus, errorIndex, \
varBindTable = cmdGen.nextCmd(
cmdgen.CommunityData( 'Name', 'Community' ),
cmdgen.UdpTransportTarget( ( 'IP Address', 161 ) ),
( ( '', 'serverName' ), ),
)
print varBindTable
Run Code Online (Sandbox Code Playgroud)
我知道放入此数据的数据是准确的,因为当我使用asynCommandGenerator.asyncNextCmd相同的数据时udpTransportTarget,CommunityData它的工作没有问题.此外,我看到的错误非常特定于MibBuilder组件.
我看到的错误是:
Traceback(最近一次调用最后一次):
文件"./snmpcollectortest.py",第11行,in
'NS-MIB-SMIv2的',
在loadModules中输入文件"/usr/lib/python2.7/site-packages/pysnmp-4.2.1-py2.7.egg/pysnmp/smi/builder.py",第221行
pysnmp.smi.error.SmiError:MIB模块"/path/to/command/mibs/MIB-File.py"加载错误:搜索路径中找不到MIB文件"ASN1.py [co]"
更新:
我发现我没有安装M2Crypto,这就是为什么我找不到ASN1.py. 不过我已经纠正了这一点,我仍然得到同样的错误.
面对PYSNMP 4.3.3的新问题.Python 2.7.13.With SNMP GET和Getnext:与Pysnmp 4.3.2一样正常.实际上我正在观察它与虚拟环境有关的问题.在虚拟环境中,即使我将Pysnmp从4.3.3降级到4.3.2,问题也会被重现.
有人可以告诉我我错过了什么吗?
TypeError:setComponentByType()获取关键字参数'verifyConstraints'的多个值
>>> from pysnmp.hlapi import *
>>> errorIndication, errorStatus, errorIndex, varBinds = next(
... getCmd(SnmpEngine(),
... CommunityData('public'),
... UdpTransportTarget(('127.0.0.1', 161)),
... ContextData(),
... ObjectType(ObjectIdentity('SNMPv2-MIB','sysDescr', 0)))
... )
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
File "/home/sourav/MyWorkSpace/tempproject_1/lib/python2.7/site-packages/pysnmp/hlapi/asyncore/sync/cmdgen.py", line 111, in getCmd
lookupMib=options.get('lookupMib', True)))
File "/home/sourav/MyWorkSpace/tempproject_1/lib/python2.7/site-packages/pysnmp/hlapi/asyncore/cmdgen.py", line 131, in getCmd
options.get('cbFun'), options.get('cbCtx'))
File "/home/sourav/MyWorkSpace/tempproject_1/lib/python2.7/site-packages/pysnmp/entity/rfc3413/cmdgen.py", line 214, in sendVarBinds
v2c.apiPDU.setVarBinds(reqPDU, varBinds)
File "/home/sourav/MyWorkSpace/tempproject_1/lib/python2.7/site-packages/pysnmp/proto/api/v1.py", line 136, in setVarBinds
varBindList.getComponentByPosition(idx), varBind
File "/home/sourav/MyWorkSpace/tempproject_1/lib/python2.7/site-packages/pysnmp/proto/api/v1.py", line …Run Code Online (Sandbox Code Playgroud) 我正在使用python 2.7并尝试使用pysnmp捕获SNMP陷阱。我正在使用http://pysnmp.sourceforge.net/examples/current/v1arch/manager/ntfrcv/v2c-multiple-transports.html中的示例。我在从varBinds正确获取键/值时遇到问题。示例代码似乎无法正常工作。
完整代码:
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
def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg):
while wholeMsg:
msgVer = int(api.decodeMessageVersion(wholeMsg))
if msgVer in api.protoModules:
pMod = api.protoModules[msgVer]
else:
print('Unsupported SNMP version %s' % msgVer)
return
reqMsg, wholeMsg = decoder.decode(
wholeMsg, asn1Spec=pMod.Message(),
)
print('Notification message from %s:%s: ' % (
transportDomain, transportAddress
)
)
reqPDU = pMod.apiMessage.getPDU(reqMsg)
if reqPDU.isSameTypeWith(pMod.TrapPDU()):
if msgVer == api.protoVersion1:
j = pMod.apiTrapPDU.getEnterprise(reqPDU)
print 'Enterprise: ({})'.format(str(j)) …Run Code Online (Sandbox Code Playgroud) 我在Python3中收到一条SNMP陷阱消息,我得到了一个十六进制数字。
如何将其转换为字符串以便我可以看到它?
接收数据(十六进制)
b'0E\x02\x01\x01\x04\x06404040\xa78\x02\x04\x00\xf6\x17~\x02\x01\x00\x02\x01\x000*0\x0f\x06\x08+\x06\x01 \x02\x01\x01\x03\x00C\x03\x01k+0\x17\x06\n+\x06\x01\x06\x03\x01\x01\x04\x01\x00\x06\t+\x06\x01\x06 \x03\x01\x01\x05\x01'
这是我的 SNMP 陷阱接收器代码
import socket
import sys
port = 162
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", port))
while 1:
data, addr = s.recvfrom(4048)
print(data)
Run Code Online (Sandbox Code Playgroud)
这是我的 SNMP 陷阱发件人代码
from pysnmp.hlapi.asyncore import *
snmpEngine = SnmpEngine()
sendNotification(
snmpEngine,
CommunityData('404040'),
UdpTransportTarget(('192.168.0.160', 162)),
ContextData(),
'trap',
NotificationType(ObjectIdentity('SNMPv2-MIB', 'coldStart')),
)
snmpEngine.transportDispatcher.runDispatcher()
Run Code Online (Sandbox Code Playgroud) 我需要一个可以监视 SNMP 代理的 SNMP 服务器。为此,我编写了一个基本的Python应用程序,并运行了一个SNMP代理(基于polinux/snmpd图像),在同一网络上,该代理具有固定的IP地址。当我从服务器容器运行 SNMP get 查询时,我得到了所需的 OIB,但是当我想使用 PySnmp 以编程方式执行相同操作时,它不起作用。我尝试了很多方法但没有成功。
你有什么主意吗?
我的泊坞窗撰写文件:
services:
spm-health-service:
build:
context: .
dockerfile: docker/Dockerfile
restart: unless-stopped
env_file:
- .env
ports:
- "4500:4500"
depends_on:
- scs-server
- network-device-identifier
spm:
image: polinux/snmpd
restart: unless-stopped
privileged: true
ports:
- "161:161/udp"
volumes:
- ./resources/snmpd-conf/snmpd.conf:/etc/snmp/snmpd.conf
- ./resources/spm-mib/:/usr/local/share/snmp/mibs/
networks:
default:
ipv4_address: 10.5.0.5
networks:
default:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1
Run Code Online (Sandbox Code Playgroud)
当我进入“spm-health-service”的bash shell时,我的命令和结果:
$ winpty docker exec -it 627 bash
root@627d241920e3:/app# snmpget -v2c -t 10 -c …Run Code Online (Sandbox Code Playgroud)