使用Python的Paramiko在远程Windows7执行PowerShell命令遇阻求助
问题:Paramiko在Windows 7执行PowerShell命令卡住或输出异常
我使用Python的Paramiko工具向远程服务器发送命令并获取数据:
- 在Windows 10服务器上执行PowerShell命令一切正常
- 在Windows 7服务器上执行PowerShell命令时,要么无限卡住;改用
invoke_shell方式不会卡住,但返回异常输出 - CMD命令在两种系统中均可正常运行
示例代码1(执行后卡住)
ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(server_address, connect_port, server_username, server_password) stdin, stdout, stderr = ssh_client.exec_command("powershell 'echo hello'") # Windows 7中执行以下任意一行都会卡住 exit_status: int = stdout.channel.recv_exit_status() output = stdout.read().decode() error = stderr.read().decode()
示例代码2(输出异常)
channel = ssh_client.invoke_shell() channel.send("powershell 'echo hello'") time.sleep(1) output = "" while channel.recv_ready(): output += channel.recv(1024).decode('utf-8')
Windows 7返回的异常输出包含大量终端控制字符和重复内容:
"\x1b[2J\x1b[2J\x1b[2J\x1b[1;1H\x1b[0;39;24;27;37;40mMicrosoft Windows [Version 6.1.7601] \n [2;1HCopyright (c) 2009 Microsoft Corporation. All rights reserved. \n\n [4;1Hbioimg@LVBT-PC C:\\Users\\bioimg>shell 'echo hello' [4;32Hshell 'echo hello' [4;33H\x1b[4;33Hhell 'echo hello' [4;34H\x1b[4;34Hell 'echo hello' [4;35H\x1b[4;35Hll 'echo hello' [4;36H\x1b[4;36Hl 'echo hello' [4;37H\x1b[4;37H 'echo hello' [4;38H\x1b[4;38H'echo hello' [4;39H\x1b[4;39Hecho hello' [4;40H\x1b[4;40Hcho hello' [4;41H\x1b[4;41Hho hello' [4;42H\x1b[4;42Ho hello' [4;43H\x1b[4;43H hello' [4;44H\x1b[4;44Hhello' [4;45H\x1b[4;45Hello' [4;46H\x1b[4;46Hllo' [4;47H\x1b[4;47Hlo' [4;48H\x1b[4;48Ho' [4;49H\x1b[4;49H' [4;50H\x1b[4;50H"
解决方案
1. 调整PowerShell执行参数(解决卡住问题)
给PowerShell添加-NoProfile(不加载用户配置文件)和-NonInteractive(非交互式模式)参数,强制命令执行后直接退出,避免Paramiko等待未结束的会话:
stdin, stdout, stderr = ssh_client.exec_command("powershell -NoProfile -NonInteractive -Command \"echo hello\"")
执行后即可正常读取退出状态、输出和错误信息。
2. 修复invoke_shell的异常输出
如果必须使用invoke_shell,可以通过以下方式处理异常输出:
- 发送命令时添加换行符:确保命令被正确执行
channel.send("powershell -NoProfile -NonInteractive -Command \"echo hello\"\n") - 过滤ANSI控制字符:用正则表达式去除终端格式控制代码
import re ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])') cleaned_output = ansi_escape.sub('', output) - 替换time.sleep为精准等待逻辑:避免依赖固定等待时间,比如等待输出中出现命令执行完成的标识(如提示符)。
3. 检查Windows 7的SSH服务器版本
Windows 7默认的OpenSSH版本可能较旧,对PowerShell的兼容性较差。尝试更新OpenSSH到兼容Windows 7的最新版本,修复底层交互逻辑问题。
内容的提问来源于stack exchange,提问作者Izik
相关产品推荐
相关产品推荐

