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

如何创建支持get/set命令响应的本地自定义SNMP OID

问题解答

关于你的代理运行模式

你当前基于pysnmp实现的模拟器完全脱离本地MIB体系独立响应请求,不需要依赖本地已加载的任何MIB文件即可处理任意OID的get/set请求:

  • 你自定义的FileInstrumController继承自AbstractMibInstrumController,并重写了readVars/writeVars核心方法,pysnmp收到SNMP请求后,会直接把请求中的OID元组透传给这两个方法,不会做本地MIB的OID存在性校验,只要方法返回符合SNMP类型规范的值,就能正常响应管理端。
  • 现有代码的逻辑是将OID作为文件名映射到/tmp目录下的文本文件,只要对应OID的文件存在、读写权限正常,就能正常返回值,和该OID是否在本地MIB中注册过没有任何关系。
  • 注意你当前VACM配置的允许访问OID根为(1,3,6),只要你要响应的自定义OID属于这个子树(即以1.3.6开头),就不会被访问控制拦截。如果需要使用1.3.6根以外的自定义OID,修改addVacmUser最后两个OID前缀参数为你的自定义根,或测试环境下直接设为空元组()放开所有OID的访问权限即可。

UUID生成唯一OID的方案可行性

该路径完全可行,但需要符合OID的编码规则:

  • OID本质是由无符号整数组成的点分序列,你可以选择一个自定义的私有OID根(测试场景可直接使用实验段如1.3.6.1.3.9999,生产场景建议使用自己的私有企业号段),将128位UUID按字节拆分为16个0-255的整数,依次拼接在私有根之后,即可得到全局唯一、不会和标准MIB OID冲突的自定义OID。
  • 禁止直接将UUID的十六进制字符串(带横杠的格式)直接作为OID段使用,OID每一段必须是整数类型,否则会触发pysnmp的类型校验错误。

快速验证方法

不需要等待UUID方案实现,你可以直接验证自定义OID的响应能力:

  1. 在/tmp目录下创建名为目标自定义OID的文件,比如文件名设为1.3.6.1.3.9999.1.0(这个OID默认不在任何本地MIB中),文件内写入测试内容如custom_oid_test。
  2. 启动代理服务后,使用snmpget工具发起请求,注意携带你配置的context名my-context,参考命令:
snmpget -v3 -u my-area -n my-context -l noAuthNoPriv 127.0.0.1 1.3.6.1.3.9999.1.0
  1. 正常情况下会直接返回你写入文件的测试值,不会报OID不存在错误,即可确认代理支持无本地MIB的自定义OID响应。

优化建议

当前代码中IO异常直接抛出SmiError会对应SNMP的通用错误genErr,如果需要符合SNMP标准规范,建议在OID对应文件不存在时抛出NoSuchInstance错误,管理端可以更准确识别OID不存在的场景。另外代理端不需要加载自定义OID对应的MIB文件,只有当你需要让管理端能识别OID的名称、数据类型、描述信息时,才需要给管理端侧提供对应的MIB文件。

内容的提问来源于stack exchange,提问作者Digit_Fish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:18:39