Netmiko超时,尽管有delay_factor = 4-OSError:在send_command_expect中未检测到搜索模式

问题描述

这是我的大型程序的一部分,但我已将错误隔离到此简短示例中:

我在Cisco IOS XE设备上运行ping命令,并且ping需要一段时间才能完成。因此,为避免不必要的超时,我在netmiko.ConnectHandler.send_command()

中加入了'delay_factor = 5'参数。

但是,我仍然收到错误消息:

[somsinha@cisco-cms.com@unlv1lnxjmpa01 pack_tests]$ time ./wo_thread.py 
Running Command: ping 1.1.1.1 so lo0 r 350 si 1400 df on R1
Traceback (most recent call last):
  File "./wo_thread.py",line 52,in <module>
    exec_cmd(v,'ping 1.1.1.1 so lo0 r 350 si 1400 df')
  File "./wo_thread.py",line 30,in exec_cmd
    res += net_connect.send_command(cmd,delay_factor=5)
  File "/home/somsinha@cisco-cms.com/pyScripts/dev/devEnv/lib/python3.7/site-packages/netmiko/utilities.py",line 363,in wrapper_decorator
    return func(self,*args,**kwargs)
  File "/home/somsinha@cisco-cms.com/pyScripts/dev/devEnv/lib/python3.7/site-packages/netmiko/base_connection.py",line 1488,in send_command
    search_pattern
OSError: Search pattern never detected in send_command_expect: R1#

real    0m23.647s
user    0m0.582s
sys     0m0.127s

由于delay_factor为5,Netmiko在抛出超时错误之前应该等待5 * 100 = 500秒= 3分钟,但是事实并非如此,因为我们看到了:real 0m23.647s。因此,仅在抛出错误时执行23秒。此外,我尝试手动测试设备完成ping实际花费的时间。我发现:

R1#sh clock
06:41:31.334 UTC Sat Oct 17 2020
R1#ping 1.1.1.1 so lo0 r 350 si 1400 df
Type escape sequence to abort.
Sending 350,1400-byte ICMP Echos to 1.1.1.1,timeout is 2 seconds:
Packet sent with a source address of 145.55.234.7 
Packet sent with the DF bit set
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (350/350),round-trip min/avg/max = 47/53/190 ms
R1#sh clock                               
06:41:55.293 UTC Sat Oct 17 2020

您可以在上方看到开始时间和结束时间的实际差异为~24 secs,因此没有理由不起作用。大家有什么想法吗?

我的代码是:

#!/usr/bin/python3
import os,sys
from netmiko import ConnectHandler
from pprint import pprint
from datetime import datetime,timedelta


dev = {
    "device_type": "cisco_xe","host": '9.9.9.9',"username": 'user',"password": 'pass',}


def exec_cmd(out,cmd):
    with ConnectHandler(**dev) as net_connect:
        if type(cmd) != list:
            d_name = net_connect.find_prompt()
            res = d_name + cmd + '\n'
            print(f"Running Command: {cmd} on {d_name.replace('#','')}",end='',flush=True)
            res += net_connect.send_command(cmd,delay_factor=5)
            out.append(res)
            print('\x1b[2K\r',end = '') # Clear the old 'Running ...' Line
            print(f"Obtained result for {cmd}")
        else:
            out_lst = []
            for c in cmd:
                exec_cmd(out_lst,c)
            out.append(out_lst)


v = []
exec_cmd(v,'ping 130.24.4.4 so lo0 r 350 si 1400 df')
print(v)
exit(1)

解决方法

原来是一个可能的错误。

请参阅:https://github.com/ktbyers/netmiko/issues/2008

修复:

在设备配置中添加"fast_cli": False。完整代码:

dev = {
    "device_type": "cisco_xe","host": '9.9.9.9',"username": 'user',"password": 'pass',"fast_cli": False,}