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

通过Python subprocess调用PuTTY执行命令无响应问题排查

问题原因分析

哦,这个问题我碰到过好多次——PuTTY本质是个图形界面程序,它的输入输出都是通过自己的窗口独立处理的,完全不会读取subprocess.PIPE传递的标准输入,也不会把命令输出写入标准输出。所以你用test.stdin.write("ls\n")根本没把命令传给PuTTY,而test.stdout.read()会一直阻塞,等待永远不会到来的输出,直到你关闭PuTTY窗口、进程结束为止。

解决方案

下面是几个可行的解决办法,按推荐程度排序:

1. 使用Plink(PuTTY的命令行版本)

Plink是PuTTY套件里专门为命令行交互设计的工具,完美支持管道输入输出,这才是适合和subprocess配合的正确选择。调整后的代码如下:

import subprocess

# 用原始字符串r''避免路径转义问题,同时用text模式简化文本交互
plink_process = subprocess.Popen(
    r'"C:\Program Files (x86)\PuTTY\plink.exe" -ssh -X -I p:\.ssh\id_dsa.ppk my_name@my_host',
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True
)

# 用communicate()替代手动write/flush/close,避免死锁
stdout_output, stderr_output = plink_process.communicate(input="ls\n")

print("命令输出:")
print(stdout_output)
if stderr_output:
    print("错误信息:")
    print(stderr_output)

这里用communicate()是因为它会自动处理输入传递、缓冲区刷新,还能避免同时读写stdout/stderr导致的死锁问题,比手动操作管道更安全可靠。

2. 用PuTTY的-m参数执行命令文件

如果你一定要用PuTTY的GUI窗口,可以先把要执行的命令写到一个文本文件里(比如commands.txt,内容就是ls),然后用-m参数让PuTTY自动执行这个文件里的命令:

import subprocess

# -m 参数指定命令文件路径,PuTTY会执行完文件里的命令后关闭窗口(加 -t 可保持窗口)
subprocess.Popen(
    r'"C:\Program Files (x86)\PuTTY\putty.exe" -ssh -X -I p:\.ssh\id_dsa.ppk my_name@my_host -m C:\your_path\commands.txt'
)

不过这个方法的缺点是:你没法直接获取命令的输出(输出只会显示在PuTTY窗口里),而且默认执行完命令就会关闭窗口,如果想保持窗口可以加-t参数。

3. 修复原代码的路径转义问题

原代码里的路径字符串存在潜在的转义风险,比如"C:\Program Files (x86)\PuTTY\putty.exe"里的\P虽然在Python中不是有效转义字符,但最好用原始字符串(前缀r)或者双反斜杠\\来避免意外,比如:

# 原始字符串写法
r'"C:\Program Files (x86)\PuTTY\putty.exe"'
# 双反斜杠写法
'"C:\\Program Files (x86)\\PuTTY\\putty.exe"'

不过这只是修复路径问题,没法解决PuTTY不支持管道输入输出的核心问题,所以还是推荐前两个方法。

4. 检查密钥与登录权限

另外,也有可能是PuTTY卡在了登录验证环节(比如密钥路径错误、密钥无权限、目标主机拒绝连接),导致脚本停滞。你可以手动打开PuTTY,用相同的密钥和主机地址登录,确认能正常连接并执行命令,排除登录层面的问题。

内容的提问来源于stack exchange,提问作者ivan_ign

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:00:45