使用Paramiko执行virsh list --all无法获取远程服务器真实输出怎么办?
解决Paramiko远程执行
virsh list --all无法获取完整输出的问题 核心原因与对应解决方法
1. 为命令分配伪终端(PTY)
virsh的部分输出依赖终端环境,而Paramiko默认的exec_command是非交互式执行,不带PTY支持。修改代码开启PTY即可:
import paramiko def paramiko_connect(hostname, command): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=hostname) # 添加get_pty=True参数启用伪终端 std_in, std_out, std_err = ssh.exec_command(command, get_pty=True) output = std_out.read().decode("utf-8") # 同时读取错误输出,排查潜在问题 err_output = std_err.read().decode("utf-8") if err_output: print(f"执行错误: {err_output}") ssh.close() return output cmd = "virsh list --all" result = paramiko_connect("10.10.10.10", cmd) print(result)
2. 验证执行用户权限
本地能看到VM列表,说明本地用户有libvirt访问权限,但Paramiko连接的远程用户可能权限不足:
- 确保连接时使用有权限的用户(如root,或已加入
libvirt用户组的普通用户) - 如果需要sudo,修改命令为
sudo virsh list --all,并提前配置该用户免密码sudo(编辑/etc/sudoers添加对应规则)
3. 使用virsh完整路径执行
远程执行时的PATH环境变量可能和本地登录时不同,导致找不到virsh可执行文件。先在远程服务器执行which virsh获取完整路径,再替换命令:
cmd = "/usr/bin/virsh list --all" # 示例路径,以实际输出为准
4. 交互式shell执行(备选)
如果上述方法无效,尝试用交互式shell执行命令(需自行过滤冗余输出):
import paramiko import time def paramiko_connect(hostname, command): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=hostname) shell = ssh.invoke_shell() shell.send(f"{command}\n") time.sleep(1) # 根据命令执行耗时调整等待时间 output = shell.recv(65535).decode("utf-8") ssh.close() # 过滤掉命令本身和提示符,提取有效输出 return "\n".join(output.split("\n")[1:-1]) cmd = "virsh list --all" result = paramiko_connect("10.10.10.10", cmd) print(result)
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

