GitHub Actions部署GCP实例遇SSH连接失败问题求助
排查GitHub Actions SCP到GCP实例权限拒绝问题的方案
以下是针对性的根因排查步骤,按优先级依次推进:
1. 验证GCP防火墙IP白名单规则
GitHub Actions Ubuntu运行器的IP为动态分配,若GCP实例的SSH端口(22)防火墙规则仅允许旧IP段访问,会导致连接被拦截:
- 临时修改GCP防火墙规则,将22端口开放至
0.0.0.0/0进行测试,若SCP成功则确认是IP白名单问题。 - 后续需添加GitHub官方公布的Actions运行器IP段至GCP防火墙允许列表。
2. 检查GCP实例SSH元数据与目标目录权限
- SSH密钥格式验证:登录GCP控制台,检查实例元数据的
ssh-keys条目格式是否为用户名:ssh-rsa 公钥内容 备注(例如ubuntu:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... runner@github),格式错误会导致密钥无法被识别。 - 目标目录权限检查:登录GCP实例,确认SCP目标目录(如
/var/lib/tomcat/webapps/)对SSH登录用户(如ubuntu)有写入权限。若需管理员权限,可拆分SCP命令为两步:scp -i key.pem code.war ubuntu@instance-ip:/tmp/ ssh -i key.pem ubuntu@instance-ip sudo mv /tmp/code.war /var/lib/tomcat/webapps/
3. 确认GitHub Actions密钥配置完整性
- 私钥存储验证:检查GitHub Secrets中存储的私钥是否完整,需包含
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----及中间所有换行内容,避免复制时丢失换行符。 - 私钥文件生成命令:确保Actions脚本中生成私钥文件的命令正确保留格式,示例:
若换行符丢失,可改用echo "${{ secrets.SSH_PRIVATE_KEY }}" > key.pem chmod 600 key.pemprintf "%s" "${{ secrets.SSH_PRIVATE_KEY }}" > key.pem。
4. 开启SCP调试模式获取详细日志
在Actions脚本中添加-v参数开启调试,查看具体报错环节:
scp -v -i key.pem code.war ubuntu@instance-ip:/target/path/
从输出日志可定位是密钥验证失败、连接被拦截还是目录权限问题。
5. 检查GCP实例SSH服务配置
登录GCP实例,验证/etc/ssh/sshd_config关键配置:
- 确认
PubkeyAuthentication yes未被注释,PasswordAuthentication no(密钥登录场景)。 - 检查
AllowUsers/DenyUsers规则是否限制了SSH登录用户。 - 修改配置后执行
sudo systemctl restart sshd重启服务。
6. 适配GitHub运行器环境变化
2022年12月GitHub可能更新了Ubuntu运行器版本(如从20.04升级至22.04),新环境SSH客户端默认加密算法可能与GCP实例不兼容,可指定兼容算法测试:
scp -o KexAlgorithms=diffie-hellman-group-exchange-sha256 -i key.pem code.war ubuntu@instance-ip:/target/path/
7. 本地环境交叉验证
将GitHub Secrets中的私钥导出至本地,执行与Actions完全一致的SCP命令:
- 若本地成功,说明问题出在GitHub Actions运行器环境;
- 若本地失败,需重新排查GCP实例的密钥配置与防火墙规则。
内容的提问来源于stack exchange,提问作者nikhil sadalagi
相关产品推荐
相关产品推荐

