You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows下使用subprocess执行ssh遇Permission denied问题求助

我来帮你搞定Windows下用subprocess调用SSH遇到的权限拒绝问题~

先把你的代码和报错整理清楚:

你的代码:

import subprocess
ssh = subprocess.Popen(['ssh', '-o', 'BatchMode=yes', <myhostname>], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print ssh.stderr.readlines()

遇到的错误:

"Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n"

之前用paramiko没问题,说明你的密钥本身是有效的,问题出在subprocess调用的SSH客户端没正确加载密钥或者环境配置不对——毕竟Windows的SSH环境和Linux差异不小。给你几个具体的解决步骤:

1. 确保SSH密钥已加入ssh-agent并正常运行

Windows下不管是用自带的OpenSSH还是Git Bash的SSH,都需要把密钥加到ssh-agent里,不然SSH客户端找不到密钥:

  • 打开命令提示符(CMD)或者PowerShell,先启动ssh-agent:
    ssh-agent
    
  • 然后添加你的私钥(替换成你的密钥路径,默认是C:\Users\<你的用户名>\.ssh\id_rsa):
    ssh-add C:\Users\YourUsername\.ssh\id_rsa
    
    如果用的是Git Bash,直接在Git Bash窗口里运行这两个命令就行。

2. 指定正确的SSH客户端路径

Windows下可能存在多个SSH客户端(系统自带的、Git的、WSL的),subprocess可能找不到正确的那个,直接指定路径更稳妥:

  • 系统自带的OpenSSH路径:C:\Windows\System32\OpenSSH\ssh.exe
  • Git的SSH路径:C:\Program Files\Git\usr\bin\ssh.exe

3. 调整subprocess的参数配置

建议去掉shell=True(Windows下容易导致环境变量不继承),同时用communicate()代替readlines()避免阻塞,修改后的代码示例:

import subprocess

# 替换成你的实际主机名
hostname = "your_target_hostname"
# 替换成你实际使用的SSH客户端路径
ssh_executable = r"C:\Windows\System32\OpenSSH\ssh.exe"

ssh_process = subprocess.Popen(
    [ssh_executable, "-o", "BatchMode=yes", hostname],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True  # 让输出直接是字符串,不用处理字节
)

# 获取输出和错误,避免readlines的阻塞问题
stdout_output, stderr_output = ssh_process.communicate()
print("标准输出:", stdout_output)
print("错误输出:", stderr_output)

4. 检查密钥文件的权限

Windows下SSH对密钥文件的权限要求很严格,如果其他用户能访问你的密钥,SSH会拒绝使用它:

  • 右键你的私钥文件(比如id_rsa)→ 属性 → 安全 → 高级
  • 点击「禁用继承」,然后删除所有非当前用户的权限条目
  • 只保留你自己的用户账户,权限设置为「完全控制」

按照这些步骤试一下,应该能解决权限拒绝的问题~

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

火山引擎 最新活动