最近在弄ansible的时候,每次使用的时候都要输入密码感觉非常的麻烦,起初是一台一台做无密码验证,但是效率太低。了解到linux是可以批量做部署的,但是需要使用expect脚本来完成。

expect脚本需要linux安装expect程序才能被支持

[root@DECMDB01 ~]# yum -y install expect

在执行的时候需要通过expect命令执行:

[root@DECMDB01 ~]# expect batch_file.exp


先看一组例子:

正常远程登陆Linux服务器:

[root@130 ~]# ssh root@192.168.222.131
The authenticity of host '192.168.222.131 (192.168.222.131)' can't be established.
RSA key fingerprint is e4:69:83:2f:74:75:56:70:87:a6:4f:b1:8d:2e:01:8f.
Are you sure you want to continue connecting (yes/no)? ^C    ##在不使用expect脚本我们需要手动输入yes/no
[root@130 ~]#

通过expect登陆Linux服务器:

[root@130 ~]# expect auto_yes.exp             ##通过expect自动化脚本执行登陆
spawn ssh root@192.168.222.131
The authenticity of host '192.168.222.131 (192.168.222.131)' can't be established.
RSA key fingerprint is e4:69:83:2f:74:75:56:70:87:a6:4f:b1:8d:2e:01:8f.
Are you sure you want to continue connecting (yes/no)? yes    ##这里的yes是脚本自动补全
Warning: Permanently added '192.168.222.131' (RSA) to the list of known hosts.
root@192.168.222.131's password:      ##密码自动填充
Last login: Fri Nov  3 03:19:31 2017 from 192.168.222.1
[root@131 ~]#              ##这里已经成功ssh到192.168.222.131

比较差异:

expect脚本避免了手动输入yes或no,如果在未来工作中,有这种交互动作非常频繁,而且响应结果一致的话,那么显然expect是个不错的选择。


=============================================================


我们画个分割线看看脚本是怎么写的

#!/bin/expect            ##指定脚本解释器
spawn ssh root@192.168.222.131        ##执行命令
expect {
        "yes/no"        {send "yes\r";exp_continue}        ##匹配到yes/no就自动输入yes,继续往下匹配
        "*password"     {send "root\r"}                ##匹配到password,则自动输入root
}
expect eof    ##结束