HP路由器通过Paramiko执行display arp会话挂起,指定IP查询却正常?
解决HP路由器Paramiko执行
display arp会话挂起的问题 这问题我碰到过好几次,典型的设备分页机制导致的阻塞——当ARP表条目多的时候,HP路由器默认会分页输出,Paramiko的会话就卡在等待用户交互的环节了,而过滤后的命令输出少,不会触发分页,所以能正常返回结果。
问题根源
HP路由器默认开启了分页显示(类似Linux的more功能),执行display arp时,输出满一页后设备会暂停,等待你按空格/回车继续输出。但Paramiko的exec_command是一次性发送命令并等待EOF,此时设备没发送结束信号,stdout.read()就会一直阻塞,会话直接挂起。而带IP或关键字过滤的display arp输出内容少,不会触发分页,所以能正常完成。
解决方案
最直接的办法是先关闭设备的分页功能,让它一次性输出所有内容,下面给两种可行的代码实现:
方法1:关闭分页后执行display arp
用exec_command一次性发送关闭分页和查询ARP的命令(HP设备常用关闭分页命令为undo terminal page,部分型号也支持terminal length 0):
import paramiko import time try: print(f"\n!!!Connecting to {ip_connect}!!!\n\n") session = paramiko.SSHClient() session.set_missing_host_key_policy(paramiko.AutoAddPolicy()) session.connect(ip_connect, username=a, password=b, timeout=20) # 先关闭分页,再执行ARP查询 stdin, stdout, stderr = session.exec_command('undo terminal page\ndisplay arp\n') # 读取并解码输出(注意:部分HP设备输出为GBK编码,需替换为decode('gbk')) data = stdout.read() + stderr.read() print(data.decode('utf-8')) session.close() except paramiko.SSHException as e: print(f"!FAILED! Error: {str(e)}")
方法2:模拟交互式会话处理分页(适合复杂场景)
如果关闭分页的命令无效,或者需要处理其他交互式操作,可以用invoke_shell()模拟手动登录设备的流程:
import paramiko import time try: print(f"\n!!!Connecting to {ip_connect}!!!\n\n") session = paramiko.SSHClient() session.set_missing_host_key_policy(paramiko.AutoAddPolicy()) session.connect(ip_connect, username=a, password=b, timeout=20) # 开启交互式shell shell = session.invoke_shell() # 关闭分页 shell.send('undo terminal page\n') time.sleep(1) # 等待设备响应 # 发送ARP查询命令 shell.send('display arp\n') time.sleep(3) # 根据ARP表大小调整等待时间,确保输出完成 # 循环读取所有输出 output = '' while shell.recv_ready(): output += shell.recv(1024).decode('utf-8') print(output) session.close() except paramiko.SSHException as e: print(f"!FAILED! Error: {str(e)}")
额外提示
- 不确定关闭分页的命令?可以手动登录设备执行
display terminal查看当前终端配置,找到分页相关的设置项。 - 遇到乱码?部分HP设备命令行输出用GBK编码,把
decode('utf-8')换成decode('gbk')就行。
内容的提问来源于stack exchange,提问作者Dover
相关产品推荐
相关产品推荐

