从Python绑定中重置net-snmp库的所有全局内部状态

1 投票
1 回答
856 浏览
提问于 2025-04-16 05:31

我正在尝试为一个硬件加软件的测试对象创建自动化集成测试,这个测试对象通过SNMP代理作为命令接口。我们的测试设置是这样的:我们使用Fitnesse作为测试运行工具,使用PyFit来用Python编写测试。然后,我们用netsnmp和Python绑定来发送SNMP命令。这一切运作得还不错。

不过,当我尝试运行一组测试时,SNMP代理(测试对象)会被重启(而且通常是在不同的模拟时间),这导致netsnmp内部出现各种奇怪的错误。

结果发现,netsnmp库内部存储了很多全局状态,比如社区名和上下文名,还有一个比较麻烦的EngineTime和EngineBootCnt,这些是用来防止SNMP v3中的重放攻击的。这导致代理拒绝我的SNMP命令。

我现在的问题是,如何从Python绑定中重新初始化netsnmp库,以便重置内部的全局状态?在Python绑定中的netsnmp.Session对象确实可以接受EngineTime和EngineBoots这两个参数,把它们设置为0应该可以重置它们,但实际上似乎并没有做到。我也不知道里面是否还有其他需要重置的全局状态。

我现在觉得可能需要重写测试,使用纯Python的snmp库pysnmp,但我希望能避免这样做。

1 个回答

1

engineTime和engineBoots这两个值可能是让你困惑的原因,因为SNMPv3要求这两个值不能回退。如果你有一个代理程序是从头开始重启的,并且没有增加它的boots计数(这其实是不合法的,但在测试中我能理解你为什么这么做),那么你需要重置内部的boots和时间的概念。

不过,把它们都设置为0是没用的,因为系统会认为这两个是默认值。你应该把其中一个改成'1',这样就会触发一个覆盖的规则,真正使用这些值。试着把时间设置为1,然后看看能不能工作(如果不行,那就把它们都设置为1再试试)。

撰写回答