GitLab Pipeline(Docker执行器)部署Java应用遇SSH权限拒绝问题
GitLab Pipeline SSH部署权限拒绝问题排查与修复
核心问题定位
你的YAML配置里有个致命错误:在流水线的Docker容器内创建~/.ssh/authorized_keys完全没用,这个文件应该放在目标VM的aminech用户~/.ssh目录下,用来授权流水线的私钥登录。
修复步骤
1. 删掉无效的配置行
把before_script里这行删掉:
- echo ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
这行纯属画蛇添足,只会干扰容器内的SSH环境。
2. 确保私钥完整写入
用printf替代echo写入私钥,避免换行符丢失导致私钥损坏:
- printf "%s" "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
(原echo命令可能会因为私钥里的换行或特殊字符,导致私钥格式失效)
3. 检查目标VM的公钥授权
手动登录目标VM,确认aminech用户的~/.ssh/authorized_keys文件里已经添加了你配置的$SSH_PUBLIC_KEY内容,同时设置正确的权限:
# 在目标VM上执行 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
4. 验证目标VM的SSHD配置
确保目标VM的/etc/ssh/sshd_config开启了公钥登录:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 # 可选:禁用密码登录增强安全性 # PasswordAuthentication no
修改后重启sshd服务:
# Ubuntu/Debian系统 sudo systemctl restart sshd # CentOS/RHEL系统 sudo systemctl restart sshd.service
5. 优化SSH命令
既然已经配置了known_hosts,就没必要关闭主机密钥检查,保留-v方便调试:
ssh -v aminech@192.168.124.149 "cd ~/Desktop/javapipline && export IMAGE_TAG=${CI_COMMIT_SHORT_SHA} && docker-compose up -d"
修正后的完整YAML
deploy_production: stage: deploy image: alpine:latest before_script: - apk add openssh-client - mkdir -p ~/.ssh - printf "%s" "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - printf "%s" "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub - chmod 600 ~/.ssh/id_rsa - chmod 644 ~/.ssh/id_rsa.pub - eval "$(ssh-agent -s)" - ssh-add ~/.ssh/id_rsa - echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: - ssh -v aminech@192.168.124.149 "cd ~/Desktop/javapipline && export IMAGE_TAG=${CI_COMMIT_SHORT_SHA} && docker-compose up -d"
内容的提问来源于stack exchange,提问作者Mohamed Amine Chouchene
相关产品推荐
相关产品推荐

