Jenkins使用ssh-agent克隆Bitbucket仓库提示Host key verification失败
问题原因
首先你遇到的Host key verification failed报错和密钥是否正确无关,属于SSH的主机公钥校验环节失败,核心原因如下:
sshagent插件的作用仅为将指定私钥加载到SSH代理进程中,处理后续的身份认证环节,不会自动添加目标主机的公钥到信任列表。- SSH协议为了防止中间人攻击,每次连接新主机时都会要求确认目标主机的公钥,确认后会将公钥写入当前用户的
~/.ssh/known_hosts文件,后续连接会自动校验。 - 你运行在Kubernetes上的Jenkins,每次启动的
docker容器都是全新的干净实例,默认~/.ssh目录为空,没有存储Bitbucket的主机公钥,非交互环境下SSH不会弹出确认提示,直接中断连接抛出该错误。
为什么同流水线其他克隆操作正常?
你前面克隆应用代码大概率使用的是Jenkins内置的checkout scm等Git插件封装的步骤,Git插件会自动调用Jenkins全局配置的受信任主机公钥列表完成校验,不需要依赖容器内的known_hosts文件;或者前面的步骤没有在docker容器内运行,使用的Jenkins Agent环境已经提前配置过Bitbucket的主机公钥。
为什么第二种方案可以成功?
你在第二种方案中主动执行了ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts,手动将Bitbucket的公钥加入了当前容器的信任列表,因此跳过了主机公钥确认环节,后续的Git克隆操作可以正常执行。
更优的解决方案
不需要手动拷贝私钥到磁盘(会增加密钥泄露风险),直接在sshagent块内加一行主机公钥扫描即可:
stage('Deploy') { steps { container('docker') { sshagent (credentials: ['sshsupersecret_key']){ sh ''' mkdir -p ~/.ssh chmod 700 ~/.ssh ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts git clone git@bitbucket.org:org_name/appconfigs.git ''' } } } }
内容的提问来源于stack exchange,提问作者the_Strider
相关产品推荐
相关产品推荐

