先看脚本
#!/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不但能免密,更能实现多线程操作,对于大批量的运维操作,这个工具将是不二之选。建议扩展学习。