如何在单个SSH会话中对Cisco交换机执行两次ping操作?
解决Paramiko单次SSH会话内连续执行Cisco交换机Ping操作失败的问题
你的问题出在Paramiko的exec_command对Cisco IOS命令的处理方式上。Cisco设备的ping命令默认是交互式的(即使指定了目标主机,也会持续发送数据包直到手动中断),这会导致exec_command的通道一直处于阻塞状态,第一次命令未正确结束就会影响后续操作,甚至触发"SSH session not active"错误。
改用交互式Shell会话来执行命令是更可靠的方案,同时给ping命令添加repeat参数让它自动完成并返回,避免阻塞。
修改后的完整代码如下:
import paramiko import time def connect_ssh(ip, username, password): ssh = paramiko.SSHClient() try: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, 22, username, password, timeout=5, look_for_keys=False, allow_agent=False) # 建立交互式Shell会话 shell = ssh.invoke_shell() # 等待设备提示符出现,确保连接就绪 time.sleep(1) shell.recv(65535) return ssh, shell, "OK" except Exception as e: return None, None, f"ERROR: {str(e)}" def remote_ping(shell, host): try: # 发送带次数的ping命令,Cisco IOS中repeat指定发送包数量 shell.send(f"ping {host} repeat 5\n") # 等待命令执行完成,根据设备响应速度调整延迟 time.sleep(3) # 读取所有输出 output = shell.recv(65535).decode() # 判断ping结果 return "OK" if "Success rate is 100 percent" in output else "ERROR" except Exception as e: return f"ERROR: {str(e)}" ip = '172.16.1.1' username = 'a' password = 'a' ssh, shell, result_ssh = connect_ssh(ip, username, password) if ssh and shell: result_first_ping = remote_ping(shell, '8.8.8.8') result_second_ping = remote_ping(shell, '8.8.4.4') ssh.close() else: result_first_ping = "SSH_FAILED" result_second_ping = "SSH_FAILED" print(f"First ping result: {result_first_ping}") print(f"Second ping result: {result_second_ping}")
关键修改说明
- 改用invoke_shell:建立持久的交互式会话,所有命令都在同一个Shell中执行,避免
exec_command每次新建通道可能带来的会话问题。 - 添加repeat参数:Cisco IOS的
ping命令加上repeat N后,会自动发送N个数据包然后结束,不会一直阻塞。 - 等待与输出读取:每次发送命令后添加适当延迟,确保设备完成命令执行并返回输出,再读取结果。
内容的提问来源于stack exchange,提问作者Seggenz
相关产品推荐
相关产品推荐

