如何解决Gcloud compute ssh报错:无可用支持身份验证方法(server sent: publickey)
解决方案
错误原因
你遇到的报错由两个问题叠加导致:
- 主机密钥冲突:你本地PuTTY缓存了之前连接相同主机名/IP时的SSH主机密钥,现在新的虚拟机密钥和旧缓存不匹配,触发了安全告警
- 认证失败:交互提示弹出后你没有及时输入确认指令,连接直接中断,导致后续公钥认证流程无法正常完成
手动修复方法
- 清理PuTTY旧缓存:按下
Win+R输入regedit打开注册表,定位到路径HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys,找到对应backend-lab1主机的IP/域名条目,右键删除即可 - 首次手动执行
gcloud compute ssh backend-lab1 --zone=europe-west1-b,弹出提示时选择yes,后续运行脚本就不会再弹出交互窗口
代码自动处理方案(无需手动确认)
给gcloud compute ssh命令添加跳过主机密钥校验、禁用交互提示的参数,即可实现自动确认yes,修改后的参考代码如下:
print('ssh back-end begin') host = "backend-lab1" # 新增参数跳过主机密钥检查,自动接受新密钥,关闭所有交互提示 cmd= f'gcloud compute ssh {host} --force-key-file-overwrite --strict-host-key-checking=no --ssh-flag="-batch"' res = subprocess.check_output(cmd, shell=True) cmd = f'gcloud compute ssh {host} --zone=europe-west1-b --strict-host-key-checking=no --ssh-flag="-batch" --command="cd /home/jeromevialhes/mse-tsm-cloudsys-lab1/app/ && sudo echo \'DATABASE_HOST=http://{ip_db}:3000\' | sudo tee /home/jeromevialhes/mse-tsm-cloudsys-lab1/app/.env && sudo echo \'DATABASE_USER=postgres\' | sudo tee -a /home/jeromevialhes/mse-tsm-cloudsys-lab1/app/.env && sudo echo \'DATABASE_PASS=postgres\' | sudo tee -a /home/jeromevialhes/mse-tsm-cloudsys-lab1/app/.env && sudo echo \'DATABASE_NAME=counter\' | sudo tee -a /home/jeromevialhes/mse-tsm-cloudsys-lab1/app/.env && sudo npm install pm2 -g && pm2 --name counter-api start npm -- start"' print(cmd) res = subprocess.check_output(cmd, shell=True) print(res) print('ssh back-end end')
补充说明
- 如果你是在Linux/macOS环境下运行脚本,将
--ssh-flag="-batch"替换为--ssh-flag="-o StrictHostKeyChecking=accept-new"即可,效果一致 - 上述参数也可以直接添加到前端虚拟机的连接代码中,所有gcloud ssh操作都无需手动确认
- 你的后端配置代码里重复写入了两次
DATABASE_USER=postgres,可以删除其中一行减少冗余操作
内容的提问来源于stack exchange,提问作者J.erome
相关产品推荐
相关产品推荐

