GitLab CI使用lftp部署时ECDSA自动校验失效无法正常部署问题
根因说明
该问题由OpenSSH版本升级导致的lftp兼容性问题引发:近期你的CI运行环境的OpenSSH大概率自动更新到了8.8及以上版本,该版本调整了主机密钥校验交互提示的输出逻辑,将原本输出到标准输出(stdout)的Are you sure you want to continue connecting (yes/no)?提示改为输出到标准错误流(stderr)。而lftp的sftp:auto-confirm yes配置仅会监听标准输出的匹配字符串,因此无法捕获到确认提示、无法自动回复yes,最终导致连接卡住触发超时重连。
可行解决方案
以下方案按改动成本从低到高、安全性从低到高排序:
- 方案1:直接修改lftp命令,给ssh传递跳过主机密钥校验参数,仅需修改原有部署命令即可生效
修改后的命令如下:
lftp -u $FTP_USERNAME,$FTP_PASSWORD -p 22 sftp://my.ftp.server -e "debug; set sftp:auto-confirm yes; set sftp:connect-program 'ssh -a -x -o StrictHostKeyChecking=no'; mirror --reverse --verbose --delete public/ mount/; bye"
新增的set sftp:connect-program 'ssh -a -x -o StrictHostKeyChecking=no'配置会直接指定ssh调用时跳过主机密钥校验步骤,不会触发交互提示,兼容所有OpenSSH版本。
- 方案2:在lftp执行前提前写入目标主机公钥到可信列表,规避安全风险
在部署流水线的lftp命令执行前,新增一步执行以下命令:
mkdir -p ~/.ssh && ssh-keyscan my.ftp.server >> ~/.ssh/known_hosts
该方案会提前将目标服务器的公钥存入当前CI运行用户的可信主机列表,ssh连接时不会再触发校验提示,同时保留了主机密钥校验能力,避免了禁用校验带来的中间人攻击风险。
- 方案3:预配置CI运行环境
如果你使用固定GitLab Runner或自定义容器镜像运行流水线,可以提前将目标主机的公钥内置到镜像的/etc/ssh/ssh_known_hosts或Runner默认用户的~/.ssh/known_hosts文件中,无需修改部署脚本即可永久解决该问题。
内容的提问来源于stack exchange,提问作者Sim Son
相关产品推荐
相关产品推荐

