不明白为什么我在python脚本中收到此错误

时间:2019-11-21 01:29:04

标签: python python-3.x syntax-error snmp pysnmp

嗨,我正在使用python 3脚本对交换机之一进行snmp设置操作。

脚本如下。

import pysnmp

from pysnmp import hlapi

def cast(value):
    try:
        return int(value)
    except (ValueError, TypeError):
        try:
            return float(value)
        except (ValueError, TypeError):
            try:
                return str(value)
            except (ValueError, TypeError):
                pass
    return value

def fetch(handler, count):
    result = []
    for i in range(count):
        try:
            error_indication, error_status, error_index, var_binds = next(handler)
            if not error_indication and not error_status:
                items = {}
                for var_bind in var_binds:
                    items[str(var_bind[0])] = cast(var_bind[1])
                result.append(items)
            else:
                raise RuntimeError('Got SNMP error: {0}'.format(error_indication))
        except StopIteration:
            break
    return result


def construct_value_pairs(list_of_pairs):
    pairs = []
    for key, value in list_of_pairs.items():
        pairs.append(hlapi.ObjectType(hlapi.ObjectIdentity(key), value))
    return pairs

def set(target, value_pairs, credentials, port=161, engine=hlapi.SnmpEngine(), context=hlapi.ContextData()):
    handler = hlapi.setCmd(
        engine,
        credentials,
        hlapi.UdpTransportTarget((target, port)),
        context,
        *construct_value_pairs(value_pairs)
    )
    return fetch(handler, 1)[0]

如果我运行set('10.23.193.153', {'1.3.6.1.2.1.1.5.0': 'Test1'}, hlapi.CommunityData('public'))

脚本已执行,并且交换机上的主机名更改为Test1。

但是,如果我使用

进行其他设置操作
set('10.23.193.153', {'1.3.6.1.4.1.11.2.14.11.5.1.16.19.1.2.1': 'admin'}, hlapi.CommunityData('public'))

我收到以下错误。 上面的oid更改了交换机的用户名。

> ============ RESTART: C:/Users/regop/Desktop/SNMP Password Reset.py ============ Traceback (most recent call last):   File "C:/Users/regop/Desktop/SNMP Password Reset.py", line 53, in <module>
>     set('10.23.193.153', {'1.3.6.1.4.1.11.2.14.11.5.1.16.19.1.2.1': 'admin'}, hlapi.CommunityData('public'))   File
> "C:/Users/regop/Desktop/SNMP Password Reset.py", line 49, in set
>     return fetch(handler, 1)[0]   File "C:/Users/regop/Desktop/SNMP Password Reset.py", line 22, in fetch
>     error_indication, error_status, error_index, var_binds = next(handler)   File
> "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\hlapi\asyncore\sync\cmdgen.py",
> line 214, in setCmd
>     cmdgen.setCmd(snmpEngine, authData, transportTarget,   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\hlapi\asyncore\cmdgen.py",
> line 239, in setCmd
>     return cmdgen.SetCommandGenerator().sendVarBinds(   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\entity\rfc3413\cmdgen.py",
> line 249, in sendVarBinds
>     v2c.apiPDU.setVarBinds(reqPDU, varBinds)   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\proto\api\v1.py",
> line 131, in setVarBinds
>     apiVarBind.setOIDVal(   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\proto\api\v1.py",
> line 42, in setOIDVal
>     varBind.setComponentByPosition(1).getComponentByPosition(1).setComponentByType(val.getTagSet(),
> val, verifyConstraints=False, matchTags=False, matchConstraints=False,
> innerFlag=True) AttributeError: 'str' object has no attribute
> 'getTagSet'

不确定我在这里做什么。

2 个答案:

答案 0 :(得分:1)

这个未处理的异常感觉就像是pysnmp中的错误,但这与您的问题无关。

我的猜测是问题是由您的第二个OID在MIB上无法解析引起的,因此值(admin)不会自动转换为某些SNMP类型的对象。

解决方案是以下之一:

  • 通过其symbolic names(MIB,符号,实例ID)引用您的SNMP对象
  • 继续使用OID,但要预先加载定义该OID的MIB
  • 继续使用OID,但将您的值作为SNMP objects传递,这样就不需要MIB

答案 1 :(得分:0)

我有相同的错误,因为我的SNMP设备不支持“整数”来写,而仅支持“字符串”。 我建议检查您的OID地址是否支持“字符串”来写。