GitLab Pipeline执行SCP时出现Permission denied问题求助
GitLab Pipeline SCP传输文件Permission Denied 问题解决
问题场景回顾
本地已生成专用SSH密钥对,公钥成功添加至服务器授权列表,本地可通过密钥免密SSH/SCP操作,但GitLab Pipeline执行SCP时出现Permission denied (publickey,password)错误。
排查与修复步骤
1. 验证Pipeline中密钥是否成功加载
在before_script中添加密钥指纹查看命令,确认私钥是否被ssh-agent正确加载:
before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$IDENTITY" | tr -d '\r' | ssh-add - > /dev/null - ssh-add -l # 新增:查看已加载的密钥指纹 - mkdir -p ~/.ssh - chmod 700 ~/.ssh
若输出中无目标密钥指纹,说明加载失败:
- 检查GitLab变量
IDENTITY:确保包含完整私钥文本(含-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----行),无多余空格/换行。 - 将变量类型设为File(GitLab项目设置→CI/CD→变量中勾选"File"),避免换行符被转义。
2. 修正服务器端SSH权限
服务器.ssh目录及authorized_keys权限不符合要求会导致公钥失效,登录服务器执行:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R user:user ~/.ssh # 替换为你的服务器用户名
同时确认authorized_keys中完整包含id_rsa_pipeline.pub内容。
3. 统一SCP命令中的主机标识
错误日志显示SCP用user@development,但实际指向user@server,说明Runner环境无法解析development别名:
- 直接替换为服务器IP:
after_script: - scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /path/to/my/file.txt user@192.168.1.50:/home/user/
- 若为自有Runner,可在Runner的
~/.ssh/config中添加别名配置:
Host development HostName 192.168.1.50 User user
4. 显式指定密钥路径(备选方案)
跳过ssh-agent,直接在SCP中指定私钥:
先在before_script写入私钥文件:
before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - mkdir -p ~/.ssh - echo "$IDENTITY" | tr -d '\r' > ~/.ssh/id_rsa_pipeline - chmod 600 ~/.ssh/id_rsa_pipeline - chmod 700 ~/.ssh
再修改SCP命令:
after_script: - scp -i ~/.ssh/id_rsa_pipeline -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /path/to/my/file.txt user@192.168.1.50:/home/user/
5. 检查服务器SSH配置
确认服务器/etc/ssh/sshd_config开启公钥认证:
grep -E "PubkeyAuthentication|PasswordAuthentication" /etc/ssh/sshd_config
确保PubkeyAuthentication yes,修改后重启sshd:systemctl restart sshd
内容的提问来源于stack exchange,提问作者praiseHellRaiseDale
相关产品推荐
相关产品推荐

