You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:45:04