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 结合达到免交互式输密码

实战:

所有服务器的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

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐