GitLab Alpine Runner SSH连接VPS权限拒绝问题求助
GitLab CI Alpine Runner SSH Permission Denied 问题排查与解决
核心问题定位
本地执行ssh -i key root@myawesomedomain.fr -p 51仍需输入密码,说明私钥认证的核心环节存在问题,优先解决本地登录问题,Runner的认证失败会随之解决。
分步排查与修复
1. 本地私钥文件检查
- 确保私钥权限严格为600:
SSH会拒绝权限过于开放的私钥文件,这是常见的认证失败原因。chmod 600 key - 确认私钥为无密码加密:如果私钥设置了密码,GitLab CI的非交互式环境无法输入密码,导致
ssh-add失败。需重新生成无密码私钥:ssh-keygen -t rsa -b 4096 -N "" -f key - 校验私钥格式完整性:私钥必须包含完整的头部
-----BEGIN RSA PRIVATE KEY-----、尾部-----END RSA PRIVATE KEY-----,且中间每行内容无缺失。GitLab变量$SSHVPS需完整复制私钥内容(包括所有换行),避免格式损坏。
2. 服务器端authorized_keys配置修复
- 不要覆盖已有配置:追加公钥到authorized_keys,避免丢失其他合法密钥:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys - 验证公钥配对性:本地执行以下命令导出私钥对应的公钥,与服务器
~/.ssh/authorized_keys中的内容完全比对:ssh-keygen -y -f key - 修正文件所有者与权限:确保所有文件属于root用户(因为你用root登录):
chown -R root:root ~/.ssh chmod 700 ~ chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
3. SSH服务器配置校验
编辑/etc/ssh/sshd_config,确保以下参数配置正确:
# 开启公钥认证 PubkeyAuthentication yes # 允许root通过公钥登录(prohibit-password更安全,禁止密码登录) PermitRootLogin prohibit-password # 监听端口设置为51 Port 51
修改后重启SSH服务:
# 基于systemd的系统(如Ubuntu 16.04+/CentOS 7+) systemctl restart sshd # 基于init的系统 /etc/init.d/sshd restart
同时确认VPS防火墙已开放51端口:
# UFW防火墙 ufw allow 51/tcp # iptables iptables -A INPUT -p tcp --dport 51 -j ACCEPT
4. GitLab CI配置优化
调整CI配置,解决Alpine环境下的私钥加载问题:
deploy: tags: - springVps image: alpine:3.6 stage: deploy before_script: - apk update && apk add --no-cache openssh-client - mkdir -p ~/.ssh - eval $(ssh-agent -s) # 使用-e参数解析换行,确保私钥完整加载 - echo -e "$SSHVPS" | ssh-add - # 指定扫描51端口的主机密钥 - ssh-keyscan -p 51 myawesomedomain.fr >> ~/.ssh/known_hosts # 验证私钥是否成功加载 - ssh-add -l script: - ssh -p 51 root@myawesomedomain.fr "echo Hello, world!"
验证步骤
- 本地执行
ssh -i key root@myawesomedomain.fr -p 51,确认无需输入密码即可登录。 - 重新触发GitLab CI流水线,检查deploy阶段是否成功执行。
内容的提问来源于stack exchange,提问作者Jean Moulin
相关产品推荐
相关产品推荐

