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

