Linux解决第一次ssh连接服务器需要输yes或者scp报host key verification failed
·
Linux第一次远程连接服务器需要建立共识,所以ssh会让输yes,scp会报错host key verification failed
尤其是需要批量操作多台服务器,仅用sshpass或者expect并不能完全解决,完全自动化,还是需要手动
但是只要连接过一次之后,后续便不会再有此问题
那么我们如何快乐度过这一关,开开心心的远程连接呢
这个时候一个参数便爆出了,他就是StrictHostKeyChecking
只需要我们 ssh -o StrictHostKeyChecking=no 设置好这个参数就完美避过初次连接带来的尴尬,直接进入,无需再手动交互
值得注意的是这个参数只有ssh有,scp是没有的,所以我们如果先用scp还是不行的,这里可以先用ssh来连接一下随便执行个命令探探路即可
比如 ssh -o StrictHostKeyChecking=no root@${ip1} 'echo 111'
与sshpass,expect 结合达到免交互式输密码
- sshpass的使用:https://blog.csdn.net/mochou111/article/details/103387638
- except的使用:https://blog.csdn.net/mochou111/article/details/106240807
实战:
所有服务器的MySQL root密码全忘记了,我需要一一给重置掉,重置MySQL密码的思路是,更改my.cnf文件,加上跳过密码skip-grant-tables=1,然后无密码登录,输入脚本更改密码,再更改my.cnf文件取消跳过密码,即可
批量的操作方法:
- 把所有IP放到一个列表里
- 先用上述的方法ssh StrictHostKeyChecking 打通所有IP
- 把原先的cnf文件备份并改名,把加上跳过密码的cnf文件传输过去,重启数据库
- 更改密码
- 把跳过密码的cnf文件更改文件名,把原先的cnf文件改回原名,重启数据库,完成
全代码如下:
#!/bin/sh
list1="192.168.xx.xx 10.133.xx.xx 172.10.xx.xx"
# 打通IP
for ip1 in ${list1};do
echo ${ip1}
sshpass -pPASSWORD ssh -o StrictHostKeyChecking=no root@${ip1} 'echo 1'
done
for ip1 in ${list1};do
#为了防止名字重复,自己的cnf文件先命名为my_1.cnf
sshpass -pPASSWORD scp /tmp/my_1.cnf root@${ip1}:/tmp
#包含所有改密码的相关sql
sshpass -pPASSWORD scp /tmp/up.sql root@${ip1}:/tmp
sshpass -pPASSWORD ssh -o StrictHostKeyChecking=no root@${ip1} << EOF
cd /etc
mv my.cnf my_bak.cnf
mv my_1.cnf my.cnf
service mysqld restart
EOF
#运行sql,改密码
sshpass -pPASSWORD ssh -o StrictHostKeyChecking=no root@${ip1} 'mysql -uroot -p </tmp/up.sql'
#改回源文件,重启数据库
sshpass -pPASSWORD ssh -o StrictHostKeyChecking=no root@${ip1} << EOF
cd /etc
mv my.cnf my_1.cnf
mv my_bak.cnf my.cnf
service mysqld restart
EOF
done
更多推荐


所有评论(0)