You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:07:03