我正在尝试为这个硬件+软件测试主题创建自动化集成测试,该测试主题运行 SNMP 代理作为命令接口(interface)。我们的测试设置如下所示:我们使用 Fitnesse 作为测试运行程序,并使用 PyFit 来使用 Python 编写测试。然后,我们使用带有 Python 绑定(bind)的 netsnmp 来发送 SNMP 命令。这效果非常好。
但是,当我尝试运行套件时,SNMP 代理(测试对象)会重新启动(通常在不同的模拟时间),这使得 netsnmp 的内部出现各种有趣的错误。
事实证明,netsnmp 库中存储了很多全局状态,例如社区和上下文名称,以及有问题的 EngineTime 和 EngineBootCnt,它们用于防止 SNMP v3 中的重放攻击。这会导致代理拒绝我的 snmp 命令。
我的问题是如何以重置内部全局状态的方式重新初始化 netsnmp 库(从 Python 绑定(bind))? Python 绑定(bind)中的 netsnmp.Session 对象确实采用参数 EngineTime 和 EngineBoots 并将它们设置为 0 应该重置它们,但实际上它似乎并没有这样做。我也不知道是否还有其他全局状态需要重置。
我认为我需要重写测试以使用纯 python snmp 库 pysnmp,但我希望避免它。
最佳答案
engineTime 和engineBoots 值可能会让您感到困惑,因为SNMPv3 要求它们不能倒退。如果您有一个从头开始重新启动的代理,并且不增加其 Boot 计数(这是非法的,但在测试中我可以明白您为什么要这样做),那么您需要重置 Boot 和时间的内部概念。
但是,将它们设置为 0 和 0 不会有帮助,因为它会假设这些是默认值。相反,您应该将其中之一更改为“1”,这将触发覆盖子句以实际使用这些值。将时间设置为 1 并尝试一下,我认为它会起作用(如果不起作用,请将它们都设置为 1 并尝试)。
关于python - 从 Python 绑定(bind)重置 net-snmp 库的所有全局内部状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3940057/