Jenkins流水线执行SCP报Host key verification failed问题排查
解决Jenkins流水线SCP "Host key Verification failed" 问题
嘿,我来帮你搞定这个问题!你在服务器命令行能成功执行SCP,但Jenkins流水线里失败,核心原因很简单:你手动执行命令用的是ubuntu用户,而Jenkins流水线是用jenkins系统用户运行的——这两个用户的SSH信任列表(~/.ssh/known_hosts)是完全分开的,jenkins用户根本没见过目标AWS服务器的主机密钥,所以触发了验证失败。
下面给你几个靠谱的解决办法,按推荐程度排序:
1. 让Jenkins用户手动信任目标主机密钥(最安全)
直接切换到jenkins用户,手动执行一次SSH连接,确认信任目标主机:
# 切换到jenkins用户 sudo su - jenkins # 用你的pem文件连接目标服务器,会弹出是否信任主机的提示 ssh -i /home/ubuntu/connec/new_one.pem ubuntu@00.00.000.00
当看到类似Are you sure you want to continue connecting (yes/no/[fingerprint])?的提示时,输入yes回车,这样jenkins用户的~/.ssh/known_hosts就会自动记录目标主机的密钥了。
⚠️ 额外注意:
- 确保你的pem文件权限是
600(太宽松会被SSH拒绝):chmod 600 /home/ubuntu/connec/new_one.pem - 如果
jenkins用户读不到这个pem文件,最好把它复制到jenkins用户的SSH目录下:sudo cp /home/ubuntu/connec/new_one.pem /var/lib/jenkins/.ssh/ sudo chmod 600 /var/lib/jenkins/.ssh/new_one.pem sudo chown jenkins:jenkins /var/lib/jenkins/.ssh/new_one.pem
2. 提前把目标主机密钥写入Jenkins用户的known_hosts(适合自动化场景)
如果不想手动交互,可以直接用ssh-keyscan获取目标主机的公钥,追加到jenkins用户的信任列表:
# 获取目标主机的公钥并写入jenkins用户的known_hosts ssh-keyscan 00.00.000.00 >> /var/lib/jenkins/.ssh/known_hosts # 确保文件权限正确 sudo chmod 600 /var/lib/jenkins/.ssh/known_hosts sudo chown jenkins:jenkins /var/lib/jenkins/.ssh/known_hosts
执行完这个操作后,Jenkins流水线再跑SCP就不会触发验证错误了。
3. 临时跳过主机密钥验证(仅应急用,不推荐生产环境)
如果只是临时测试,可以在SCP命令里添加-o StrictHostKeyChecking=no参数,强制跳过验证:
stage('Deliver') { steps { sh 'scp -o StrictHostKeyChecking=no -i /home/ubuntu/connec/new_one.pem **/target/*.jar ubuntu@00.00.000.00:/home/ubuntu/...' } }
⚠️ 注意:这个方法会关闭SSH的主机密钥验证,存在中间人攻击的风险,生产环境绝对不要用!
内容的提问来源于stack exchange,提问作者Pranavadurai
相关产品推荐
相关产品推荐

