有没有办法在 pysnmp 的 snmpset 事务中插入延迟?

Is there a way to insert a delay in a snmpset transaction in pysnmp?

总而言之,我对 python 还很陌生,但我编写脚本的方法是在不牺牲可读性的情况下尝试使用尽可能少的代码行。话虽如此,这就是我试图用手头的脚本做的。

我有一个脚本可以通过 Pysnmp 从 cisco 交换机获取 运行 或启动配置并将其发送到 TFTP 服务器。这需要在交换机上设置多个 OID 的值。当我尝试通过 snmp 在单个 setCmd 命令上设置多个 OID 的值时:

g = setCmd(SnmpEngine(),
                   CommunityData(snmp_community),
                   UdpTransportTarget((host_ip, 161)),
                   ContextData(),
                   ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopyProtocol', random_number), 1),
                   #ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopySourceFileType', random_number), users_numeric_entry),
                   #ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopyDestFileType', random_number), 1),
                   #ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopyServerAddress', random_number), '10.10.11.100'),
                   #ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopyFileName', random_number), destination_file),
                   #ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopyEntryRowStatus', random_number), 1)
                   )

        next(g)

我可以在交换机上(通过调试)看到 SNMP 数据包已传送,但应用它们(设置 OID 的值)时一定存在计时问题。 With that being said, is there a way to insert a few millisecond delay between each setCmd command?

当单独设置每个 OID 的值时,我的脚本按预期工作,并且配置被复制到 TFTP 服务器。因此,对于我需要为其设置值的每个 OID,我有一个 setCmd,如下所示:

g = setCmd(SnmpEngine(),
                   CommunityData(snmp_community),
                   UdpTransportTarget((host_ip, 161)),
                   ContextData(),
                   ObjectType(ObjectIdentity('CISCO-CONFIG-COPY-MIB', 'ccCopySourceFileType', random_number),
                              users_numeric_entry))

        next(g)

我在单个 setCmd 命令中设置所有 OID 的问题真的是延迟问题吗?如果是这样,我可以在命令中插入延迟吗?

感谢您的宝贵时间!

正在使用来自 SWITCH 的调试进行更新

发送单个时调试setCmd:

00:19:16: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:19:16: SNMP: Get request, reqid 2179409, errstat 0, erridx 0
 system.5.0 = NULL TYPE/VALUE
00:19:16: SNMP: Response, reqid 2179409, errstat 0, erridx 0
 system.5.0 = Switch
00:19:16: SNMP: Packet sent via UDP to 10.10.10.10
00:19:17: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:19:17: SNMP: Set request, reqid 2179410, errstat 0, erridx 0
 ccCopyEntry.2.21 = 1
 ccCopyEntry.3.21 = 4
 ccCopyEntry.4.21
Switch# = 1
 ccCopyEntry.5.21 = 10.10.10.10
 ccCopyEntry.6.21 = Switch-running.txt
 ccCopyEntry.14.21 = 1
00:19:17: SNMP: Response, reqid 2179410, errstat 12, erridx 6
 ccCopyEntry.2.21 = 1
 ccCopyEntry.3.21 = 4
 ccCopyEntry.4.21 = 1
 ccCopyEntry.5.21 = 10.10.10.10
 ccCopyEntry.6.21 = Switch-running.txt
 ccCopyEntry.14.21 = 1
00:19:17: SNMP: Packet sent via UDP to 10.10.10.10

当我发送单独的 setCmd 命令时:

00:15:33: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:33: SNMP: Get request, reqid -1563913845, errstat 0, erridx 0
 system.5.0 = NULL TYPE/VALUE
00:15:33: SNMP: Response, reqid -1563913845, errstat 0, erridx 0
 system.5.0 = Switch
00:15:33: SNMP: Packet sent via UDP to 10.10.10.10
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Set request, reqid -1563913844, errstat 0, erridx 0
 ccCopyEntry.2.102 = 1
00:15:34: SNMP: Response, req
Switch#id -1563913844, errstat 0, erridx 0
 ccCopyEntry.2.102 = 1
00:15:34: SNMP: Packet sent via UDP to 10.10.10.10
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Set request, reqid -1563913843, errstat 0, erridx 0
 ccCopyEntry.3.102 = 3
00:15:34: SNMP: Response, reqid -1563913843, errstat 0, erridx 0
 ccCopyEntry.3.102 = 3
00:15:34: SNMP: Packet sent via UDP to 10.10.10.10
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Set request, reqid
Switch# -1563913842, errstat 0, erridx 0
 ccCopyEntry.4.102 = 1
00:15:34: SNMP: Response, reqid -1563913842, errstat 0, erridx 0
 ccCopyEntry.4.102 = 1
00:15:34: SNMP: Packet sent via UDP to 10.10.10.10
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Set request, reqid -1563913841, errstat 0, erridx 0
 ccCopyEntry.5.102 = 10.0.1.81
00:15:34: SNMP: Response, reqid -1563913841, errstat 0, erridx 0
 ccCopyEntry.5.102 = 10.0.1.81
00:15:34: SNMP: Packet sent via UDP to 10.0.
Switch#1.20
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Set request, reqid -1563913840, errstat 0, erridx 0
 ccCopyEntry.6.102 = Switch--start.txt
00:15:34: SNMP: Response, reqid -1563913840, errstat 0, erridx 0
 ccCopyEntry.6.102 = Switch--start.txt
00:15:34: SNMP: Packet sent via UDP to 10.10.10.10
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Set request, reqid -1563913839, errstat 0, erridx 0
 ccCopyEntry.14.102 =
Switch#1
00:15:34: SNMP: Response, reqid -1563913839, errstat 0, erridx 0
 ccCopyEntry.14.102 = 1
00:15:34: SNMP: Packet sent via UDP to 10.10.10.10
00:15:34: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:34: SNMP: Get request, reqid -1563913838, errstat 0, erridx 0
 ccCopyEntry.10.102 = NULL TYPE/VALUE
00:15:34: SNMP: Response, reqid -1563913838, errstat 0, erridx 0
 ccCopyEntry.10.102 = 2
00:15:34: SNMP: Packet sent via UDP to 10.10.10.10
Switch#
00:15:37: SNMP: Packet received via UDP from 10.10.10.10 on Vlan1
00:15:37: SNMP: Set request, reqid -1563913837, errstat 0, erridx 0
 ccCopyEntry.14.102 = 6
00:15:37: SNMP: Response, reqid -1563913837, errstat 0, erridx 0
 ccCopyEntry.14.102 = 6
00:15:37: SNMP: Packet sent via UDP to 10.10.10.10

我不认为你可以在 cisco 交换机中设置 SNMP 代理来延迟单独处理 SNMP 变量。您(作为用户)应该注意时间安排,这看起来也非常可疑...

所以我可能会尝试理解为什么交换机不喜欢您的管理命令,管理它的正确方法是什么....一个可能的灵感来源是 MIB 中的描述,您所在的变量铲球被定义。

该条目遵循 https://www.rfc-editor.org/rfc/rfc2579

中详述的 RowStatus 语义

在我看来,您需要将 ccCopyEntryRowStatus 设置为 createAndGo 而不是 active。