我需要使用Python设置一些OID参数。 我使用pysnmp库制作了这个简单的脚本。它正确地读取OID但是当我尝试设置一个刚读取时,我收到消息“此OID当前不存在此类对象”。 可以帮我?提前谢谢。
from pysnmp.hlapi import *
print "Get OID"
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((hostIP, 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.6.0')),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.9.1.2.1')),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.9.1.3.1')))
)
for varBind in varBinds:
print varBind
print "Set OID"
errorIndication, errorStatus, errorIndex, varBinds = next(
setCmd(SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget((hostIP, 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.9.1.3.1'),
OctetString('new value')))
)
for varBind in varBinds:
print varBind
我使用了MIB浏览器(CommunityData ='private'进行设置),我能够为snmp v2设备(Selta ONU)设置特定的OID,提供特定OID的凭据。
这是设定顺序:
1.3.6.1.4.1.10060.1.6.10.4.1.1.0 =“用户名”
1.3.6.1.4.1.10060.1.6.10.4.1.2.0 =“密码”
1.3.6.1.4.1.10060.1.6.10.4.2.0 = 1(会话状态= START)
会话开始后我设置了参数
1.3.6.1.4.1.10060.1.6.6.3.29.1.4.1 =“17a_RTX”
1.3.6.1.4.1.10060.1.6.10.4.2.0 = 3(会话状态= COMMIT)
所以存储了新值。 在这次成功经验之后,我以这种方式修改了Python脚本:
from pysnmp.hlapi import *
print "Get OID"
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('163.162.105.120', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.6.0')),
ObjectType(ObjectIdentity('1.3.6.1.4.1.10060.1.6.10.4.3.0')) # get session status
)
)
for varBind in varBinds:
print varBind
print "Set Credentials"
errorIndication, errorStatus, errorIndex, varBinds = next(
setCmd(SnmpEngine(),
CommunityData('private', mpModel=1),
UdpTransportTarget(('163.162.105.120', 161)),
ContextData(), ObjectType(ObjectIdentity('1.3.6.1.4.1.10060.1.6.10.4.1.1.0'),OctetString('username')),
ObjectType(ObjectIdentity('1.3.6.1.4.1.10060.1.6.10.4.1.2.0'),OctetString('password')),
ObjectType(ObjectIdentity('1.3.6.1.4.1.10060.1.6.10.4.2.0'),Integer(1)) # open session
)
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print varBind
print "Set OID"
errorIndication, errorStatus, errorIndex, varBinds = next(
setCmd(SnmpEngine(),
CommunityData('private', mpModel=1),
UdpTransportTarget(('163.162.105.120', 161)),
ContextData(), ObjectType(ObjectIdentity('1.3.6.1.4.1.10060.1.6.6.3.29.1.4.1'),OctetString('17a_noRTX')))
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print varBind
不幸的是我收到了以下错误:
Get OID
SNMPv2-MIB::sysDescr.0 = SAMBHA
SNMPv2-MIB::sysLocation.0 = Cadeo(PC)
SNMPv2-SMI::enterprises.10060.1.6.10.4.3.0 = 0
Set Credentials
'noSuchName' at 1.3.6.1.4.1.10060.1.6.10.4.1.2.0
Set OID
'authorizationError' at 1.3.6.1.4.1.10060.1.6.6.3.29.1.4.1
在脚本中看不到在MIB浏览器中设置的相同OID 1.3.6.1.4.1.10060.1.6.10.4.1.2.0。 你有什么建议吗?
答案 0 :(得分:0)
到目前为止,我没有看到您的代码存在任何问题。我非常有信心,您的SNMP代理不允许您修改要修改的托管对象。
它是否适用于Net-SNMP的snmpset?
snmpset -v1 -c public 1.3.6.1.2.1.1.9.1.3.1 s 'new value'
顺便说一下,SNMP代理经常被配置为使用不同的SNMP社区字符串进行读写操作。有时默认为私有用于写入。
答案 1 :(得分:0)
@Ilya,我尝试使用net-snmp。
snmpget -v 2c -c public 163.162.105.120 1.3.6.1.4.1.10060.1.6.6.3.29.1.11.1
SNMPv2-SMI :: enterprises.10060.1.6.6.3.29.1.11.1 = STRING:“VirtualNoiseProfile”
snmpset -v 2c -c public 163.162.105.120 1.3.6.1.4.1.10060.1.6.6.3.29.1.11.1 s "new string"
数据包错误。 原因:noAccess
snmpset -v 2c -c private 163.162.105.120 1.3.6.1.4.1.10060.1.6.6.3.29.1.11.1 s "new string"
数据包错误。 原因:authorizationError(拒绝该对象的访问) 失败的对象:SNMPv2-SMI :: enterprises.10060.1.6.6.3.29.1.11.1
主机不允许设置操作,也不公开既不是私有,也不是python消息 误导性(“此OID目前不存在此类对象”)。 我想,我应该学习如何设置授权配置文件。但我没有找到任何例子。 谢谢。