根本原因是SSH客户端校验失败,即本地known_hosts中存储的主机公钥与远程服务器当前提供的不一致;需用ssh-keygen -R精准删除对应条目后重新连接确认新指纹。

Python调用git命令时触发Host key verification failed
根本原因不是Python本身的问题,而是它启动的子进程(比如git pull)复用了当前用户的SSH环境,包括~/.ssh/known_hosts里已存的旧主机密钥。一旦远程Git服务器更换了SSH主机密钥(如GitHub 2023年RSA轮换、内网Git重装),Python脚本执行subprocess.run(["git", "pull"])就会卡在SSH握手阶段,报Host key verification failed并直接退出。
为什么不能靠try/except捕获这个错误
这个错误发生在SSH客户端层(OpenSSH),早于Git命令的逻辑执行,Python的subprocess只能拿到非零退出码和stderr输出,无法“绕过”或“忽略”该安全校验。常见误操作包括:
- 试图用
shell=True加2>/dev/null隐藏错误——只会掩盖问题,git仍失败 - 在Python里调用
os.system("git pull")却不检查返回值——错误静默,后续逻辑可能出错 - 以为改
git config --global core.sshCommand就能生效——该配置只影响交互式git命令,不自动继承给subprocess
安全且可落地的修复方式
必须从SSH层解决,而不是在Python里兜圈子。优先按以下顺序排查:
- 确认目标主机:从报错信息里提取域名或IP(如
github.com或[192.168.1.100]:2222),注意带端口时要用方括号包裹 - 精准清理记录:
ssh-keygen -R github.com或ssh-keygen -R [192.168.1.100]:2222,别删整个known_hosts - 验证是否生效:在终端手动运行
ssh -T git@github.com,看到Welcome to GitHub才算通 - 确保Python脚本用的是同一用户环境:避免用
sudo或切换user执行,否则~/.ssh路径会变
如果是在CI/CD环境(如GitHub Actions或Jenkins)中遇到,需额外检查是否启用了ssh-agent或是否被流水线覆盖了HOME路径——这时候~/.ssh可能指向了错误位置。
立即学习“Python免费学习笔记(深入)”;


















