pysnmp如何实现类似snmpwalk -Ov选项仅返回查询值的功能
pysnmp没有内置和snmpwalk -Ov完全对应的参数配置,你可以直接处理SNMP返回的varBinds结构实现仅提取返回值的效果。
实现逻辑
pysnmp所有查询类接口返回的结果中,最后一个元素为varBinds列表,列表中每个元素都是(OID对象, 返回值)的二元结构,你只需要提取每个元素的第二个值即可。
代码修改示例
你可以直接修改fetch函数,在结果处理阶段过滤掉OID,仅保留值:
def fetch(handler, count): result = [] for _ in range(count): error_indication, error_status, error_index, var_binds = next(handler) # 可保留你原有实现中的异常判断逻辑 if error_indication: raise RuntimeError(f"SNMP请求错误: {error_indication}") if error_status: raise RuntimeError(f"SNMP响应错误: {error_status.prettyPrint()}") # 仅提取值,丢弃OID row_values = [item[1] for item in var_binds] result.append(row_values) return result
如果你的查询只传单个OID,想要直接返回单个值而非列表,可以进一步修改get函数的返回逻辑:
def get(target, oids, credentials, port=1024, engine=hlapi.SnmpEngine(), context=hlapi.ContextData()): handler = hlapi.getCmd( engine, credentials, hlapi.UdpTransportTarget((target, port)), context, *construct_object_types(oids) ) # 单个OID查询直接返回第一个值 return fetch(handler, 1)[0][0]
补充说明
如果需要把返回值转成可读的字符串格式,可以调用值的prettyPrint()方法,写法为item[1].prettyPrint(),输出效果和snmpwalk默认输出的value格式完全一致。
如果是用nextCmd/bulkCmd做walk类的批量查询,逻辑完全相同,仅需要提取varBinds每个元素的第二个值即可。
内容的提问来源于stack exchange,提问作者masl
相关产品推荐
相关产品推荐

