批量免密之不同IP,不同密码之间的批量免密脚本

先看脚本

#!/usr/bin/expect -f

while read  ip  password
do

expect<<-END
spawn  ssh-copy-id $ip
expect {
"password:" {send "${password}\r"; exp_continue}
}
expect eof
exit
END
done < ipfile.txt

这里我们要在脚本的同级目录下创建一个文档,名为ipfile.txt

格式为:ip   passwd

例如:192.168.0.11   123456

  

shell脚本是一个好东西,好就好在各种复杂的操作都可以用脚本来实现。

运维工程师必须要会shell语言,在业务自管理的运维模式中,会不会使用shell脚本加定时任务来实现自动化运维,将是决定一个运维工程师是否合格的关键因素。

通过上面这个简单点的脚本,我们来探讨一下shell脚本的写作思路。

首先,做免密,我们需要什么?

1,一个跳板机

2,一个或多个目标服务器

3,各个服务器的账号密码

以上三个因素知道了之后,我们需要在跳板机上使用ssh-key-gen命令,一路敲回车,会在当前用户的家目录下生成两个文件,其中就包含有跳板机的公钥

接下来,我们使用ssh-copy-id  192.168.0.11将跳板机的公钥传到目标服务器的对应文件下即可。

道理就是这个道理,再深刻一点讲下去,其实意义不太大。可有个关键的地方是:如果我有多个IP,每个IP的密码都不一样该怎么处理免密问题?

难点在于,

1,shell脚本是如何处理交互的?

这里最常用的是expect,这个命令在很多情况下需要我们手动安装。怎么装?yum,或者tar,或者RPM,反正能装上就行。然后,要考虑的是,expect这个命令的使用格式。从哪里开始,遇见什么关键字开始交互,以什么来结束?

2,shell脚本是如何处理文本输入的?

文本输入的方法有很多,但我们要根据实际情况来选择最实用的一种。比如上面这种情况,需要同时传入两个变量,IP和password。我们需要做到的是:在任何情况下,都要保证脚本的通用性,最小限制的去更改脚本中的语句。所以,我们把变量 放在外部文件来读取。而while read这种语句格式,就很好地解决了我们目前的问题。

理解了以上两点,我们的脚本就有了非常清晰的思路,接下来无非就是一步步的调试,直到完成。

让我们再深刻一点,如果我想通过一个跳板机,对多个IP的不同用户进行免密,这些密码还都不一样。该怎么做?

一切思路都是基于上面那个脚本,我们只需要将目标IP的用户做成一个变量即可,如果在ipfile.txt文本中加入一个用户列,再通过while read来定义一个变量,放在ssh-copy-id命令之后,即可完美解决。

#!/usr/bin/expect -f

while read  ip  password  user
do

expect<<-END
spawn  ssh-copy-id $user@$ip
expect {
"password:" {send "${password}\r"; exp_continue}
}
expect eof
exit
END
done < ipfile.txt

这里我们要在脚本的同级目录下创建一个文档,名为ipfile.txt

格式为:ip   passwd  user

例如:192.168.0.11   123456   test

192.168.0.12   1234567   test1

所以,不会根据实际情况改脚本的运维,不是一个好运维。

延伸一下:

自动化运维的路,从shell开始,而后要更进一步,就必须使用自动化运维工具,比如ansible

ansible不但能免密,更能实现多线程操作,对于大批量的运维操作,这个工具将是不二之选。建议扩展学习。

你可能感兴趣的:(批量免密之不同IP,不同密码之间的批量免密脚本)