Jenkins解决Host key verification failed
分析原因情况
一、用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。
SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来配置的。默认情况下,StrictHostKeyChecking=ask。
简单说下它的三种配置值:
StrictHostKeyChecking=no
最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
StrictHostKeyChecking=ask
默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
StrictHostKeyChecking=yes
最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。
二、使用 ssh-keygen -R hostname 命令
ssh-keygen -R xxx.xxx.xxx.xxx (服务器ip地址)
目的是清除你当前机器里关于你的远程服务器的缓存和公钥信息,注意是大写的字母“R”。
这里相当于重新配置跟目标主机的链接关系
使用man命令查看下ssh-keygen命令的详细用法
解决问题步骤
1、出错的问题需要初始化操作 - 采用成功
a.jenkins普通用户无法执行某些系统命令;
b.没有为jenkins用户生成过密钥对,也没有将他的公钥拷到目标服务器上.
解决办法:
(1)在安装jenkins后,系统生成了jenkins这个普通用户,但是在/etc/passwd中,他的shell是/bin/false,所以他不能登录系统,也没有家目录;
首先我们修改他的登录权限,将/bin/false改为/bin/bash,切换到jenkins用户,su - jenkins,他的终端显示为-bash-4.2$
jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/bash
(2)生成jenkins用户密钥对
[root@bogon .ssh]# su - jenkins
-bash-4.2$ ssh-keygen -t rsa
回车
# 把公钥传输到目标服务器上
-bash-4.2$ ssh-copy-id -i /var/lib/jenkins/.ssh/id_rsa.pub root@192.168.1.1
(3)使用sudo提升普通用户权限
vim /etc/sudoer ,进行修改操作,和visudo操作一样
用visudo 去修改文件,命令和命令之间要用逗号,最后用visudo -c检查语法是否出错.
visudo
root ALL=(ALL) ALL # 原有的
jenkins ALL=(ALL) NOPASSWD:/usr/bin/ssh,/usr/bin/rsync # 新增的
最后就能够在jenkins中使用command命令执行了
最后不要忘了重启操作
systemctl restart jenkins
2、第二种解决方法 - 未采用
一般这个问题,是你重置过你的服务器后。你再次想访问会出现这个问题。
ssh-keygen -R 你要访问的IP地址
ssh-keygen -R ip
# Host ip found: line 2 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old
3、第三种解决办法 - 未采用
解决方法:
(1) 在 .ssh目录下添加config文件,键入
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
(2)删除 .ssh/know_hosts中对应ip的相关rsa信息
设置authorized_keys 为644
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
4、第四周记录错误信息 - 未采用
(1)go_test 工程 中 /root/.ssh/authorized_keys 中构建机的jenkins 用户的 公钥更新了
(2)直接更新构建机 ssh-keygen -t rsa,公钥信息更新了,重新生成
(3)这期间不用重启sshd ,jenkins
5、记录我在构建机上使用rsync命令同步代码到目标主机失败的原因,并且我手动在构建机运行可以成功 - 采用成功
前提是在root账户里ssh目标主机可成功
原因:root账户的 .ssh中know_hosts中存在目标主机ip记录,但是jenkins账户的.ssh的know_host中不存在目标主机ip记录,因为构建机运行的账户其实是以jenkins运行的,所有之前一直失败。
修改:登录到 jenkins账户,进行 ssh登录验证,将ip相关信息自动加入到known_host中
(1) su - jenkins
(2) cd .ssh
(3) ssh root@ip(目标主机ip)
(4) 不用重启任务主机