Paramiko调用异常:Cisco设备exec_command报错及无返回结果问题
解决Paramiko与网络设备/主机交互的两个常见问题
我之前也碰到过类似的Paramiko交互坑,结合你的问题给你梳理下可行的解决方案:
问题1:invoke_shell()返回命令文本而非执行结果
这是因为invoke_shell()是模拟交互式终端会话,设备会回显你输入的命令(就像你在终端手动敲命令时会看到自己打的内容一样)。要拿到纯执行结果,需要手动过滤掉回显的命令和终端提示符。
举个实用的代码示例(以Cisco设备为例,Linux主机同理):
import paramiko import time def get_shell_output(ssh, command, prompt=">"): shell = ssh.invoke_shell() # 先等待初始提示符出现 while not shell.recv_ready(): time.sleep(0.1) # 发送命令,注意末尾加换行符 shell.send(f"{command}\n") # 等待命令执行完成并返回输出(复杂命令可延长等待时间,或用循环检查输出) time.sleep(2) output = shell.recv(65535).decode("utf-8") # 过滤掉命令回显和末尾的提示符 if f"{command}\n" in output: result = output.split(f"{command}\n")[1].split(prompt)[0].strip() else: result = output.split(prompt)[0].strip() return result # 连接示例 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("your_device_ip", username="admin", password="your_pass") # 执行命令并获取结果 print(get_shell_output(ssh, "show version", prompt="Router>")) ssh.close()
核心逻辑是:通过分割字符串,提取输入命令和终端提示符之间的内容,这就是我们需要的纯执行结果。
问题2:exec_command()在Cisco设备报错,且Linux主机也无法获取结果
针对Cisco设备的报错
报错Extra params found in CLI, this is not supported...说明你的Cisco设备仅支持哑终端/交互式SSH会话,不支持Paramiko exec_command()使用的exec通道。这类设备只能用invoke_shell()来交互,也就是上面问题1的解决方案。
针对Linux主机无结果的问题
如果连Linux主机执行uptime或ifconfig也只返回命令本身,大概率是你没有正确读取exec_command()的输出流。exec_command()返回的是stdin, stdout, stderr三个文件对象,必须主动读取stdout才能拿到结果。正确用法示例:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("linux_host_ip", username="user", password="your_pass") # 执行命令并读取输出 stdin, stdout, stderr = ssh.exec_command("uptime") stdout_content = stdout.read().decode("utf-8").strip() stderr_content = stderr.read().decode("utf-8").strip() print("执行结果:") print(stdout_content) if stderr_content: print("错误信息:") print(stderr_content) ssh.close()
之前你可能只调用了exec_command()但没读取stdout,导致误以为没有返回结果。
内容的提问来源于stack exchange,提问作者sayyid9000
相关产品推荐
相关产品推荐

