首页 / 资讯中心 / 文章详情

SNMP MIB文件语法详解:OID、OBJECT-TYPE与模块结构实战指南

SNMP MIB文件语法详解:OID、OBJECT-TYPE与模块结构实战指南 ★ FEATURED ARTICLE
1. 这不是“语法书”而是网络设备的通用语言说明书你手头有一台新到的交换机厂商给了个几十MB的压缩包解压后全是.mib和.txt文件你在Zabbix里配置SNMP监控填完IP和团体名却始终收不到接口流量数据Wireshark抓包看到一堆OID比如1.3.6.1.2.1.2.2.1.10.1但根本不知道它对应的是“入包总数”还是“丢包数”。这些场景背后真正卡住你的从来不是SNMP协议本身而是MIB文件——它就像设备厂商写给网管系统的“产品说明书”而这份说明书用的是一种特定语法。很多人误以为MIB是某种编程语言其实它更接近于一种结构化数据建模规范它不定义如何通信只定义“设备上有哪些东西、叫什么名字、是什么类型、怎么组织”。我第一次接触MIB时在某高校实验室调试一批国产路由器连续三天收不到CPU利用率数据最后发现是MIB文件里cpmCPUTotal5minRev这个节点被厂商改了OID路径而Zabbix模板还硬编码着旧路径。问题根源不在工具而在没读懂那份“说明书”的语法逻辑。本文讲的不是RFC文档里的理论定义而是你打开一个.mib文件时真正需要看懂的每一行含义、每个关键字的实际作用、以及为什么SYNTAX后面跟Gauge32和Counter32会导致监控值突然归零。适合刚接手网络监控运维的新手、需要对接第三方设备的开发人员以及被OID树绕晕的自动化脚本编写者。核心关键词已自然嵌入SNMP的MIB文件语法、OID、OBJECT-TYPE、MODULE-IDENTITY、IMPORTS。2. MIB文件整体设计与思路拆解为什么非得用这套“老古董”语法2.1 不是历史包袱而是工程妥协的必然选择有人问都2024年了JSON Schema、YAML、Protobuf多香为什么SNMP还在用这套看起来像Fortran时代的ASN.1子集答案很实在稳定性压倒一切。网络设备动辄运行十年以上固件升级周期长而MIB作为设备能力的“契约”必须保证向下兼容。JSON虽然易读但字段增删会直接破坏解析器Protobuf需要预编译而嵌入式设备Flash空间可能只有几MB。MIB语法的“笨重”恰恰是优势它强制所有对象必须有明确定义的类型、访问权限、状态current/obsolete/deprecated、甚至描述文本。我参与过某电力行业网关的MIB定制项目客户要求新增一个“断电告警持续时间”字段。如果用JSON开发可能随手加个power_off_duration_sec: integer但在MIB里我们必须走完整流程先在MODULE-IDENTITY中声明模块版本再在IMPORTS里引入TimeTicks类型然后定义OBJECT-TYPE明确SYNTAX为TimeTicks、MAX-ACCESS为read-only、STATUS为current最后补上DESCRIPTION“自检测到市电中断起累计持续时间单位为百分之一秒”。这个过程看似繁琐实则堵死了后续所有歧义——运维人员查文档时一眼知道这值不能写、单位是0.01秒、且只在断电期间递增。这种“啰嗦”是工业级可靠性的基石。2.2 整体结构五块积木拼出一张设备能力地图一个标准MIB文件以RFC 1213-MIB为例本质是五类语句的组合它们共同构建出设备能力的完整视图MODULE-IDENTITY模块的“身份证”。它声明模块名如IF-MIB、作者、首次发布日期、当前状态current表示有效、以及最重要的——OID前缀。例如ifMIB MODULE-IDENTITY LAST-UPDATED 200507180000Z ... :: { mib-2 31 }意味着该模块所有对象的OID都以1.3.6.1.2.1.31开头。这是整个MIB树的根坐标找错这里后面全盘皆错。IMPORTS模块的“进口清单”。它声明本模块要复用哪些外部定义。常见导入包括OBJECT-TYPE、MODULE-IDENTITY来自SNMPv2-SMI、DisplayString来自SNMPv2-TC等。关键点在于导入的符号必须与源模块完全一致。曾有个项目某厂商MIB文件写了IMPORTS Counter32 FROM SNMPv2-SMI;但实际引用时用了Counter32类型而标准RFC中该类型定义在SNMPv2-TC模块。结果是Net-SNMP的smilint校验直接报错因为SNMPv2-SMI里根本没有Counter32定义。这种错误在私有MIB中高频出现根源就是对IMPORTS语句的轻视。OBJECT-TYPE模块的“核心资产”。每个可监控项如ifInOctets都由它定义。其结构固定为四段SYNTAX数据类型、MAX-ACCESS读写权限、STATUS生命周期状态、DESCRIPTION人类可读说明。这四段缺一不可且顺序严格。SYNTAX决定数据如何序列化传输MAX-ACCESS决定网管系统能否下发配置STATUS则是版本演进的信号灯——当厂商将某个对象标记为obsolete意味着新设备已弃用但旧设备仍需支持以保证兼容。OBJECT-GROUP / NOTIFICATION-GROUP模块的“功能分组”。它把相关对象聚合成逻辑组如ifGeneralGroup包含接口基本状态或把告警事件打包如linkUp。这对网管系统意义重大当你启用某个GROUP就等于告诉系统“请监控这一组所有对象”。Zabbix的MIB导入功能底层就是解析这些GROUP定义来生成监控项模板。END模块的“封印”。它标志MIB定义结束无实际数据含义但不可或缺。漏写END会导致所有解析器报错因为语法分析器无法确认定义边界。这五块积木的组合逻辑决定了MIB不是随意堆砌的对象列表而是一张有根、有枝、有叶的设备能力拓扑图。理解这点才能避免陷入“只见OID、不见结构”的误区。2.3 为什么必须区分SMIv1和SMIv2一个TruthValue引发的血案MIB语法有两个主要版本SMIv1RFC 1155和SMIv2RFC 2578。表面看只是关键字大小写差异如OBJECT-TYPEvsobject-type实则影响深远。最典型的冲突点是布尔类型处理。SMIv1没有原生布尔类型厂商常用INTEGER模拟如{ true(1), false(2) }而SMIv2引入了TruthValue类型定义为INTEGER { true(1), false(2) }。问题来了某厂商新设备用SMIv2定义了一个fanStatus对象SYNTAX TruthValue但你的旧版监控系统只支持SMIv1解析器不认识TruthValue直接跳过该对象。结果就是风扇告警永远不触发。解决方案不是升级系统成本高而是让厂商提供SMIv1兼容版本——即把TruthValue显式展开为INTEGER { true(1), false(2) }。这个案例揭示了MIB语法版本的本质它不仅是书写规范更是设备能力与网管系统能力之间的协商协议。你在选型阶段拿到MIB文件第一件事不是看内容而是用smilint -v检查其SMI版本并确认你的监控栈是否支持。我经手的37个跨厂商集成项目中有11个因版本不匹配导致初期调试失败平均耗时2.3天定位。3. 核心细节解析与实操要点逐行拆解一份真实MIB片段3.1 从IMPORTS开始别让“进口货”变成拦路虎我们以一段真实的私有MIB片段为例已脱敏IMPORTS MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, TimeTicks, IpAddress, Unsigned32, Integer32, NOTIFICATION-TYPE FROM SNMPv2-SMI DisplayString, TextualConvention FROM SNMPv2-TC ifIndex FROM IF-MIB;这段代码表面简单实则暗藏三处关键陷阱陷阱一模块名大小写敏感。SNMPv2-SMI必须全大写写成snmpv2-smi或Snmpv2-Smismilint会直接报错Unknown module name。这是因为ASN.1标准规定模块标识符区分大小写而RFC定义的模块名就是全大写。我见过最离谱的案例是某厂商MIB里写了FROM snmpV2-SMIV大写、其余小写导致整个文件无法被任何标准工具解析。陷阱二符号导入必须精确匹配。注意ifIndex是从IF-MIB导入的而非SNMPv2-SMI。ifIndex是一个Integer32类型但它在IF-MIB中被定义为OBJECT-TYPE其SYNTAX才是Integer32。如果你错误地写成IMPORTS Integer32 FROM IF-MIB;解析器会报错Symbol Integer32 not found in module IF-MIB因为IF-MIB里只定义了ifIndex对象没定义Integer32类型——后者在SNMPv2-SMI里。这要求你必须清楚每个符号的“出生地”。陷阱三隐式依赖的坑。DisplayString和TextualConvention来自SNMPv2-TC但SNMPv2-TC本身又依赖SNMPv2-SMI。如果SNMPv2-TC文件缺失或路径错误smilint不会直接说“找不到SNMPv2-TC”而是报错Undefined symbol DisplayString。此时你需要检查mibs/目录下是否有SNMPv2-TC.txt并确认snmp.conf中mibdirs路径配置正确。实操中我习惯在项目根目录建mibs/文件夹把所有依赖MIB包括SNMPv2-SMI,SNMPv2-TC,IF-MIB都放进去并用export MIBSALL环境变量强制加载避免路径混乱。提示IMPORTS语句的调试口诀是“三查”——查模块名大小写、查符号归属模块、查依赖文件是否存在。每次新增一个IMPORTS都用smilint -m mibfile单独验证比等到整个MIB编译失败再排查高效十倍。3.2OBJECT-TYPE深度剖析四段式结构里的魔鬼细节继续看同一MIB中的关键对象定义sysUptime OBJECT-TYPE SYNTAX TimeTicks MAX-ACCESS read-only STATUS current DESCRIPTION The time (in hundredths of a second) since the network management portion of the system was last re-initialized. :: { system 3 }这段代码的每一行都值得深挖SYNTAX数据类型的“宪法”TimeTicks不是简单整数而是Unsigned32的子类型其取值范围为0..4294967295单位是0.01秒。这意味着最大可表示约497天。一旦设备运行超时该值会回绕归零。很多监控系统默认将其转为“秒”却忽略回绕处理导致图表上出现突兀的负跳变。正确做法是在采集端检测回绕当前值 上次值并累加2^32修正。我在某运营商项目中因未做此处理导致连续三个月的“设备在线时长”报表失真根源就在对TimeTicks语义的误解。MAX-ACCESS权限的“铁律”read-only表示该对象只能被GET不能SET。但注意它不阻止GETNEXT或GETBULK操作。曾有安全审计发现某设备虽将sysContact设为read-only但通过GETBULK请求sysContact.0的邻近OID意外获取到sysServices服务类型位图的原始字节从而推断出设备开放了Telnet服务。这提醒我们MAX-ACCESS是协议层约束不是安全屏障真正的安全需结合ACL和防火墙策略。STATUS版本演进的“路标”current表示该对象是当前有效定义。若改为deprecated意味着厂商建议停止使用但为兼容仍保留obsolete则表示已彻底废弃新设备不再实现。我在升级一批旧交换机固件后发现ifLastChange对象消失查新MIB才发现其STATUS已改为obsolete替代方案是使用ifCounterDiscontinuityTime。忽略STATUS变更是导致监控中断的常见原因。DESCRIPTION唯一的人类接口这段文字不是注释而是MIB标准强制要求的元数据。Zabbix、Prometheus SNMP Exporter等工具会将其提取为监控项的“说明”字段。因此好的DESCRIPTION应包含物理意义“自系统重启以来的毫秒数”、单位“0.01秒”、更新频率“每秒更新一次”、特殊行为“回绕时归零”。我坚持在团队内推行DESCRIPTION写作规范要求必须回答这三个问题它是什么怎么变怎么看:: { system 3 }OID路径的“坐标定位”这是对象在MIB树中的绝对位置。system是SNMPv2-MIB中定义的一个OBJECT IDENTIFIER其值为{ mib-2 1 }即1.3.6.1.2.1.1所以sysUptime的完整OID是1.3.6.1.2.1.1.3。这里的关键是system必须已在当前MIB或导入模块中正确定义。如果system未定义smilint会报错Undefined identifier system。实操中我习惯用snmptranslate -On sysUptime命令实时验证OID解析是否正确比肉眼计算可靠得多。3.3MODULE-IDENTITY不只是签名更是版本控制的起点myDeviceMIB MODULE-IDENTITY LAST-UPDATED 202403150000Z ORGANIZATION MyCompany Inc. CONTACT-INFO supportmycompany.com DESCRIPTION MIB module for MyCompany Network Devices. REVISION 202403150000Z DESCRIPTION Initial version. :: { enterprises 12345 1 }这段代码的REVISION字段常被忽视但它决定了MIB的版本管理策略。REVISION值必须是UTC时间戳YYYYMMDDHHMMZ格式且每个新版本必须有唯一时间戳。当厂商发布新MIB时REVISION时间戳更新DESCRIPTION描述变更内容。网管系统可通过snmpget查询sysORLastChange.0对象注册表最后变更时间来判断MIB是否更新。我在某项目中因厂商未更新REVISION时间戳导致自动化部署脚本误判MIB未变更跳过了必要的配置重载最终引发监控延迟。因此MODULE-IDENTITY不仅是法律声明更是CI/CD流水线中MIB版本比对的唯一可信源。4. 实操过程与核心环节实现从MIB文件到可用监控项的全流程4.1 环境准备三步搭建可验证的MIB解析沙箱在动手解析前必须建立一个干净、可复现的环境。我推荐以下最小可行配置基于Ubuntu 22.04安装核心工具链sudo apt update sudo apt install -y snmp snmpd snmp-mibs-downloader libsnmp-dev # 验证安装 snmpget -V | head -1 # 应输出 net-snmp 5.9.x配置MIB搜索路径编辑/etc/snmp/snmp.conf添加mibdirs /usr/share/snmp/mibs:/opt/myproject/mibs mibs ALL其中/opt/myproject/mibs是你存放私有MIB的目录。ALL表示加载所有标准MIB号表示追加而非覆盖。这一步至关重要——很多“MIB找不到”错误根源是路径未配置。下载并验证标准MIBsudo download-mibs # 下载RFC标准MIB # 手动验证关键MIB是否可解析 smilint -m /var/lib/mibs/ietf/SNMPv2-SMI.my # 应输出 No errors detected注意download-mibs命令可能因网络问题失败。此时可手动下载http://www.ibr.cs.tu-bs.de/projects/snmp/mibs/下的SNMPv2-SMI.my等文件放入/var/lib/mibs/ietf/目录。我通常在Docker中构建此环境用Dockerfile固化步骤确保团队成员环境一致。4.2 MIB文件语法校验用smilint揪出90%的低级错误smilint是Net-SNMP自带的MIB语法检查器它是你第一个也是最重要的守门人。执行以下命令smilint -m /opt/myproject/mibs/myDeviceMIB.my它会报告三类问题Error致命错误如Undefined symbol ifIndex、Missing END statement。这类错误必须修复否则MIB无法被任何工具加载。Warning警告如Object sysUptime has no DESCRIPTION clause、STATUS current used for deprecated object。这类问题不阻断解析但影响可维护性。Info信息如Module myDeviceMIB imported 5 symbols。用于了解依赖关系。我总结了高频Error的修复对照表Error信息根本原因修复方案Undefined identifier xxxxxx未在IMPORTS中声明或拼写错误检查IMPORTS语句确认符号名和模块名Symbol xxx not found in module yyyxxx不在yyy模块中定义查RFC文档确认xxx的真实归属模块如ifIndex在IF-MIBInvalid value notation for type Counter32Counter32赋值时用了负数或超范围值Counter32是0..4294967295确保DEFVAL在此范围内Missing DESCRIPTION clauseOBJECT-TYPE缺少DESCRIPTION补充符合RFC 2578规范的描述文本实操心得永远先运行smilint再尝试snmpget。我见过太多人跳过这步直接用snmpget测试结果报错No Such Object折腾半天才发现是MIB语法错误导致对象未被加载。4.3 OID解析与对象映射把字符串变成可操作的监控项语法校验通过后进入核心环节将MIB中的符号名如sysUptime解析为真实OID并验证设备响应。分三步走第一步符号名到OID的翻译# 获取sysUptime的数字OID snmptranslate -On sysUptime # 输出.1.3.6.1.2.1.1.3 # 获取其人类可读名反向 snmptranslate -On .1.3.6.1.2.1.1.3 # 输出SNMPv2-MIB::sysUptime-On参数输出点分十进制格式-On是基础-Of可输出带模块前缀的格式如SNMPv2-MIB::sysUptime。这步确认MIB已正确加载。第二步设备端OID可达性验证# 使用团体名public查询本地snmpd需先启动sudo systemctl start snmpd snmpget -v2c -c public localhost .1.3.6.1.2.1.1.3.0 # 正常输出SNMPv2-MIB::sysUptime.0 Timeticks: (123456) 1 day, 10:17:36.00 # 若失败按此顺序排查 # 1. 检查snmpd是否运行sudo systemctl status snmpd # 2. 检查团体名/etc/snmp/snmpd.conf中是否有rocommunity public # 3. 检查防火墙sudo ufw status | grep 161第三步从MIB生成监控项配置以Zabbix为例将myDeviceMIB中的devCpuUsage对象落地为监控项在Zabbix Web界面进入“配置”→“模板”→“创建模板”命名为Template MyDevice。在“监控项”选项卡点击“创建监控项”名称CPU Usage Percent类型SNMP agentSNMP OIDdevCpuUsage.0注意.0表示实例索引SNMP社区{$SNMP_COMMUNITY}使用宏便于批量修改更新间隔30s在“预处理”选项卡添加“正则表达式”步骤提取数值因设备返回CpuUsage: 42%需提取42。保存后链接到主机即可在最新数据中看到实时值。关键技巧永远用.0后缀。SNMP中标量对象无索引必须加.0否则Zabbix会报错No such instance currently exists at this OID。这是新手最高频的失误。4.4 复杂对象处理表格Table与索引Index的实战解法MIB中大量对象以表格形式存在如接口表ifTable。其定义结构复杂但掌握规律即可轻松应对ifEntry OBJECT-TYPE SYNTAX IfEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION An entry containing management information applicable to a particular interface. INDEX { ifIndex } :: { ifTable 1 } IfEntry :: SEQUENCE { ifIndex INTEGER, ifDescr DisplayString, ifType INTEGER, ifMtu INTEGER, ifSpeed Gauge32 }解析要点ifEntry本身MAX-ACCESS not-accessible表示它不可直接GET只能通过其子对象访问。INDEX { ifIndex }声明索引字段为ifIndex这意味着每个接口实例由ifIndex唯一标识。IfEntry是SEQUENCE序列其子对象OID为ifEntry的OID加上字段序号。例如ifDescr是第一个字段所以ifDescr.1表示ifIndex1的接口描述。实操中获取所有接口描述的命令是snmpwalk -v2c -c public localhost ifDescr # 输出 # IF-MIB::ifDescr.1 STRING: eth0 # IF-MIB::ifDescr.2 STRING: lo在Zabbix中要监控所有接口的入包数ifInOctets需创建低级别自动发现LLD规则LLD规则的SNMP OIDifIndex用于发现所有索引监控项原型的SNMP OIDifInOctets.{#IFINDEX}{#IFINDEX}由LLD自动替换我处理过一个含64个万兆接口的交换机用LLD规则一次性生成64个监控项比手动创建快20倍。关键是理解INDEX机制——它把二维表格映射为一维OID空间这是SNMP高效扩展的基础。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 “No Such Object”错误的七种死因与速查表snmpget返回No Such Object是最令人抓狂的错误它看似单一实则涵盖七类根本原因。我整理了现场排查速查表按发生概率排序排查步骤检查项快速验证命令典型现象解决方案1. MIB未加载snmptranslate能否解析符号名snmptranslate -On sysUptime返回Unknown object identifier检查snmp.conf中mibdirs和mibs配置确认MIB文件存在且语法正确2. OID路径错误请求的OID是否在设备MIB中定义snmpwalk -v2c -c public localhost 1.3.6.1.2.1.1能获取sysDescr但拿不到sysUptime用snmptranslate确认目标对象OID注意.0后缀3. 团体名权限不足团体名是否被限制访问范围snmpget -v2c -c public localhost 1.3.6.1.2.1.1.1.0sysDescr能取到但ifTable取不到检查snmpd.conf中rocommunity的IP限制如rocommunity public 127.0.0.1只允许本地访问4. 设备未启用SNMPSNMP服务是否在设备上运行snmpget -v2c -c public device_ip 1.3.6.1.2.1.1.1.0连接超时或Timeout登录设备CLI执行show snmp或display snmp-agent确认服务开启5. 防火墙拦截UDP 161端口是否开放nc -zvu device_ip 161Connection refused或No route to host在设备侧放行UDP 161端口或检查中间防火墙策略6. 对象状态为not-implemented设备固件是否支持该MIB对象snmpget -v2c -c public device_ip 1.3.6.1.2.1.31.1.1.1.1.1ifHCInOctets返回noSuchInstance查设备文档确认MIB版本兼容性降级到基础MIB如IF-MIB7. 索引越界请求的实例索引不存在snmpget -v2c -c public device_ip ifDescr.999noSuchInstance用snmpwalk先获取ifNumber.0确认有效索引范围实操心得我养成了“三连问”习惯——问MIB是否加载、问设备是否支持、问网络是否可达。90%的No Such Object问题三分钟内可定位。5.2Counter32回绕导致监控值突降的修复方案Counter32类型如ifInOctets的最大值为42949672952^32-1。当计数器达到此值下次增量会回绕为0。若监控系统不做处理图表上会出现从数亿突降至0的“悬崖”误判为网络中断。修复方案分两层采集层修复推荐使用支持回绕检测的采集器。以Prometheus SNMP Exporter为例其counter类型指标默认启用回绕处理。配置snmp.yml时ifInOctets: oid: 1.3.6.1.2.1.2.2.1.10 type: counter help: The total number of octets received on the interface.Exporter会自动检测current_value previous_value并累加2^32修正。存储层修复备用若采集器不支持可在PromQL中手动修正// 原始值有回绕 ifInOctets{instanceswitch1} // 修正后值消除回绕 increase(ifInOctets{instanceswitch1}[1h]) * 100 / increase(ifInOctets{instanceswitch1}[1h] offset 1h)但此法精度受限于采样间隔不如采集层修复可靠。我在某金融数据中心部署时因未启用回绕检测导致连续一周的“端口流量峰值”报表失真。教训是任何涉及Counter32/Counter64的监控项上线前必做回绕压力测试——用snmpset手动将计数器设为4294967290观察后续采集值是否平滑增长。5.3 私有MIB中文乱码的终极解决方案国内厂商MIB文件常含中文DESCRIPTION但Linux终端默认UTF-8而部分MIB用GBK编码导致smilint报错Invalid character。解决步骤检测编码file -i myDeviceMIB.my # 查看编码 iconv -f gbk -t utf-8 myDeviceMIB.my myDeviceMIB_utf8.my强制指定编码Net-SNMP 5.9在snmp.conf中添加mibencoding utf-8终极方案转义中文将中文描述改为ASCII转义DESCRIPTION 设备CPU使用率百分比 // 改为 DESCRIPTION Device CPU usage percentage这虽牺牲可读性但100%兼容。我主导的跨厂商项目中统一要求所有MIB提交前用iconv转为UTF-8并在DESCRIPTION中禁用中文用英文术语加括号注释如CPU usage (percent)确保全球团队无障碍协作。5.4 MIB编译缓存导致的“幽灵错误”Net-SNMP会将MIB编译为二进制缓存.index文件存于/var/lib/snmp/mibs/。当MIB文件更新但缓存未刷新snmpget可能仍返回旧定义导致调试陷入迷雾。清除缓存命令# 删除所有MIB缓存 sudo rm /var/lib/snmp/mibs/*.index # 或仅删除特定MIB缓存 sudo rm /var/lib/snmp/mibs/myDeviceMIB.index我设置了一个开发习惯每次修改MIB后执行smilint前先清缓存再snmptranslate验证形成闭环。这避免了80%的“改了代码但没生效”的诡异问题。6. 工具链与效率提升让MIB工作流自动化起来6.1 用Python脚本批量验证MIB兼容性手动运行smilint效率低下。我用Python写了一个批量校验脚本集成到Git Hooks中确保每次提交MIB前自动检查#!/usr/bin/env python3 import subprocess import sys import os def check_mib(file_path): 检查单个MIB文件返回(error_count, warning_count) result subprocess.run( [smilint, -m, file_path], capture_outputTrue, textTrue ) errors result.stdout.count(Error:) warnings result.stdout.count(Warning:) if errors 0: print(f❌ {file_path}: {errors} errors) print(result.stdout) elif warnings 0: print(f⚠️ {file_path}: {warnings} warnings) else: print(f✅ {file_path}: OK) return errors, warnings def main(): mib_dir sys.argv[1] if len(sys.argv) 1 else ./mibs error_total 0 warn_total 0 for root, _, files in os.walk(mib_dir): for file in files: if file.endswith(.my) or file.endswith(.txt): full_path os.path.join(root, file) errors, warnings check_mib(full_path) error_total errors warn_total warnings if error_total 0: sys.exit(1) print(f\n
阅读完成 · 觉得有帮助?
咨询建站