GitLab CI建立SSH连接报错Permission denied (publickey,password)如何解决
问题修复方案
你出现Permission denied (publickey,password)报错的核心原因是SSH公钥配置位置错误,其次CI脚本存在不规范的地方,完整修复步骤如下:
核心错误点
- 你生成的SSH公钥错误存放到了GitLab用户SSH密钥库,实际上应该存到目标VPS的授权密钥文件中:SSH登录逻辑是本地(GitLab CI运行环境)持有私钥,远程主机(VPS)持有对应公钥,公钥需要写入VPS对应用户的
~/.ssh/authorized_keys文件。
修复步骤
1. 修正VPS端公钥配置
- 登录你的VPS,切换到CI要登录的
user用户 - 把你之前生成的公钥内容追加到
~/.ssh/authorized_keys文件中 - 调整VPS上的文件权限避免权限拦截:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
2. 修正GitLab CI变量配置
- 进入GitLab仓库 > Settings > CI/CD > Variables,找到
SSH_PRIVATE_KEY变量 - 确认变量没有勾选「Protect variable」选项,确认变量值是完整的私钥内容,包括开头的
-----BEGIN OPENSSH PRIVATE KEY-----和结尾的-----END OPENSSH PRIVATE KEY-----整段内容,不要有多余换行或空格。
3. 优化CI脚本(原有脚本冗余且存在风险)
把你的CI脚本替换为如下版本,注意替换实际的VPS IP和用户名:
before_script: # 安装ssh客户端 - 'which ssh-agent || ( apk update && apk add openssh-client )' # 启动ssh-agent - eval $(ssh-agent -s) # 直接注入私钥不需要写入临时文件,避免泄露风险 - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - # 创建ssh目录配置权限 - mkdir -p ~/.ssh - chmod 700 ~/.ssh # 写入VPS主机公钥到已知主机,替换为你的VPS真实IP - ssh-keyscan -t rsa 你的VPS真实IP >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: # 测试ssh连接,也可以替换为实际的部署命令 - ssh -o StrictHostKeyChecking=no user@你的VPS真实IP "echo 连接成功"
兜底排查方案
如果还是报错,可以在ssh命令前加-v参数输出详细调试日志,定位具体错误原因:
ssh -v user@你的VPS真实IP
常见额外错误场景:
- VPS的sshd配置禁用了公钥认证,检查
/etc/ssh/sshd_config中PubkeyAuthentication是否为yes - VPS安全组/防火墙没有开放22端口给GitLab CI的出口IP
- CI运行环境不是Alpine镜像,换apt包管理器安装openssh-client即可
内容的提问来源于stack exchange,提问作者Boldbayar
相关产品推荐
相关产品推荐

