You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI流水线执行scp命令时遭遇SSH主机密钥类型不匹配问题求助

GitLab CI流水线执行scp命令时遭遇SSH主机密钥类型不匹配问题求助

看起来你遇到的是SSH客户端与服务器之间主机密钥类型不兼容的问题,从服务器日志能明确看出——你的GitLab CI容器里的OpenSSH客户端只提供了基于安全密钥的算法(sk-ecdsa-sha2-nistp256@openssh.com和sk-ssh-ed25519@openssh.com),而目标服务器没有开启对这些算法的支持,导致协商失败。给你几个可行的解决办法:

1. 在scp命令中直接指定兼容的主机密钥算法

最简单的方式是在scp命令里通过-o参数添加服务器支持的密钥类型,比如如果服务器支持传统的ssh-rsa算法,你可以这样修改命令:

scp -o HostKeyAlgorithms=+ssh-rsa -P $SSH_PORT $FILES $SSH_USER@$SSH_HOST:~/

这里的+符号表示在客户端默认算法的基础上追加,而不是替换。如果服务器还支持其他算法(比如ecdsa-sha2-nistp256),可以一起加进去:

scp -o HostKeyAlgorithms=+ssh-rsa,ecdsa-sha2-nistp256 -P $SSH_PORT $FILES $SSH_USER@$SSH_HOST:~/

2. 临时配置SSH客户端的全局规则

如果你的流水线里有多个SSH相关操作,可以在执行scp前创建临时的SSH配置文件,避免每次命令都加参数:

# 创建SSH配置目录并设置权限
mkdir -p ~/.ssh
# 写入目标主机的密钥算法配置
echo -e "Host $SSH_HOST\n  HostKeyAlgorithms +ssh-rsa,ecdsa-sha2-nistp256" > ~/.ssh/config
# 配置文件必须设为600权限才能被SSH识别
chmod 600 ~/.ssh/config

之后再执行原来的scp命令即可,后续的SSH工具都会自动读取这个配置。

3. (可选)修改服务器端SSH配置(需管理员权限)

如果你有权限操作目标服务器,可以编辑/etc/ssh/sshd_config文件,确保开启了客户端支持的密钥类型:

# 确保以下配置存在(根据实际情况调整)
HostKey /etc/ssh/ssh_host_sk_ecdsa_key
HostKey /etc/ssh/ssh_host_sk_ed25519_key
HostKeyAlgorithms sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com,ssh-rsa,ecdsa-sha2-nistp256

修改后重启sshd服务:

systemctl restart sshd

不过这种方法需要服务器的管理员权限,适合你能控制目标服务器的场景。

补充说明:你之前尝试的PubkeyAcceptedKeyTypes其实是控制公钥认证的密钥类型,而这里的问题是主机密钥协商不匹配,所以应该用HostKeyAlgorithms参数哦。Alpine最新版的OpenSSH默认优先启用了安全密钥类的算法,而很多旧服务器或者默认配置的服务器可能没有开启这些类型,这就是问题的根源。

备注:内容来源于stack exchange,提问作者rhuanpk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:39:40