使用Netmiko send_command读取交换机文件无输出,求解决方案
问题:Netmiko执行长耗时Linux命令无输出及替代方案咨询
我用Python编写了一个脚本,用于登录交换机并读取交换机内存储文件的输出(该输出是对文件内容执行正则处理后的结果)。在交换机Linux提示符下执行对应命令时,需约100秒才能得到输出。我尝试使用Netmiko的send_command方法,设置delay_factor=10来将输出存储到变量中,但未得到任何输出。请问是否遗漏了基础配置?相关代码如下:
import time from netmiko import ConnectHandler def getSIPsFromFile(log, hdl, device_type): file_name = 'file_1_' + device_type print('\n *** Value of File name is : {0} ***\n'.format(file_name)) # cmd = "grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' {0}".format(file_name) cmd = 'cat {0} | grep \'[0-9]\{{1,3\}}\.[0-9]\{{1,3\}}\.[0-9]\{{1,3\}}\.[0-9]\{{1,3\}}\' | awk \'{{print $4}}\''.format(file_name) print('\n *** Value of cmd is : {0} **** \n'.format(cmd)) hdl.send_command('start-shell' , expect_string = "$") hdl.send_command('cd /tmp' , expect_string = "$") print(' *** Prompt is : {0} *** '.format(hdl.find_prompt())) res = hdl.send_command(cmd, expect_string = "$" , delay_factor = 10) time.sleep(60) print(res) vsx_pri_hdl = ConnectHandler( device_type='cisco_nxos', ip=args.vsx_primary_mgmt_ip, \ username=args.username, password=args.password, blocking_timeout=500 )
另外,如果此方法不可行,是否应考虑下载文件到本地进行分析?
问题排查与修复方案
- 显式设置命令超时:
send_command的timeout参数独立于blocking_timeout,默认值可能远小于100秒。建议在调用send_command时添加timeout=120(比实际命令耗时多预留20秒),确保有足够时间等待命令执行完成。 - 改用
send_command_timing方法:该方法不依赖提示符匹配,而是基于时间间隔等待输出结束,更适合长耗时、无固定交互的命令。替换代码:res = hdl.send_command_timing(cmd, delay_factor=10, timeout=120)。 - 验证命令转义正确性:将打印出的
cmd内容复制到交换机shell中手动执行,确认命令能正常输出结果。Python字符串中的转义字符可能导致命令变形,比如\{1,3\}在实际传递时是否正确解析为正则表达式的量词? - 移除多余的
time.sleep(60):send_command本身是阻塞式的,会等待命令执行完成或超时后才返回,额外的sleep只会浪费时间,无需保留。
替代方案:下载文件到本地分析
如果远程执行命令的方案始终存在问题,下载文件到本地处理是更可靠的选择:
- 利用Netmiko的
file_transfer方法,通过SFTP协议将交换机/tmp目录下的目标文件下载到本地(需确保交换机开启了SFTP服务)。 - 本地处理文件不受交换机环境限制,更灵活,且能避免远程命令的超时、交互匹配等问题,尤其适合大文件或复杂的数据分析场景。
内容的提问来源于stack exchange,提问作者S VIJAY
相关产品推荐
相关产品推荐

