GitLab推送代码至GCP计算实例失败问题排查求助
解决GitLab CI/CD推送代码至Debian虚拟机时的Permission Denied问题
嘿,我看你在把代码通过GitLab CI推送到GCP Debian虚拟机时碰到了Permission denied (publickey)的错误,这事儿我熟,来帮你捋捋~
为啥会报错?
从你贴的流水线输出能看到,sshpass本身是正常运行的,但服务器直接拒绝了密码登录请求,返回了公钥认证失败的提示——这是GCP虚拟机的默认安全配置,它会禁用SSH密码登录,只允许更安全的公钥认证方式。
两种解决方案,推荐第一种更安全的
方案1:改用SSH公钥认证(强烈推荐)
既然你已经生成了SSH密钥并加到GitLab了,不如直接把GitLab Runner的公钥授权给虚拟机,这样既安全又稳定:
- 第一步:获取GitLab Runner的公钥
如果用的是GitLab共享Runner,你需要在项目的「Settings > CI/CD > Variables」里添加一个私钥变量(比如叫SSH_PRIVATE_KEY),值就是你生成的私钥内容;如果是自己部署的Runner,直接找Runner所在机器的~/.ssh/id_rsa.pub公钥文件内容。 - 第二步:把公钥加到虚拟机的授权列表
先登录到你的GCP虚拟机,然后执行这些命令:# 把公钥内容追加到授权文件里,替换成你的公钥字符串 echo "你的公钥内容" >> ~/.ssh/authorized_keys # 必须设置正确的权限,否则公钥认证会失败 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - 第三步:修改.gitlab-ci.yml配置
删掉sshpass相关的命令,换成SSH代理的方式:
别忘了在GitLab项目的CI/CD变量里添加before_script: - apt-get update -qq && apt-get install -y -qq openssh-client deploy_stage: stage: deploy environment: Staging only: - stage script: - ls # 启动SSH代理并加载私钥 - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - # 配置已知主机,避免首次连接的确认提示 - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan xx.xxx.xx.xx >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts # 用scp推送代码 - scp -r . xxxxxx@xx.xxx.xx.xx:/datastore/testSSH_PRIVATE_KEY,值就是你的私钥内容,注意不要有多余的空格或换行哦。
方案2:开启虚拟机的密码登录(不推荐,安全性差)
如果你非要用密码方式,那得先把虚拟机的SSH密码登录打开:
- 登录到虚拟机,修改SSH配置文件:
找到这两个配置项,改成下面这样:sudo nano /etc/ssh/sshd_configPasswordAuthentication yes ChallengeResponseAuthentication no - 重启SSH服务让配置生效:
sudo systemctl restart sshd - 还要给你的虚拟机用户
xxxxxx设置密码(GCP默认没给用户设密码):
做完这些再跑流水线,应该就能用sudo passwd xxxxxxsshpass登录了。
额外要检查的点
- 确认GCP虚拟机的防火墙规则允许22端口(SSH)的入站流量,不然连都连不上。
- 检查
/datastore/test目录的权限,确保xxxxxx用户有写入权限:sudo chown -R xxxxxx:xxxxxx /datastore/test
内容的提问来源于stack exchange,提问作者Siva Rajadurai
相关产品推荐
相关产品推荐

