一.expect工具介绍
在写脚本的过程当中不可避免的需要去写交互式命令
那么如何让交互式命令在脚本中自动执行?
使用expect工具
作用:捕获交互式的输出,自动执行交互式命令
如上图所示,可以使用expect工具去捕获交互式命令的提示信息。
然后让expect工具自动地在这个提示信息之后去填充我们准备好的一些数据
1.spawn命令
作用:指定捕获哪个命令的输出,即指定捕获哪个交互式命令
1.spawn命令是expect命令提供给我们的
这个命令可以用来去捕获交互式命令产生的输出。
语法:spawn 命令
2.expect命令
作用:指定捕获的信息,即指定捕获这个交互式命令的哪部分提示信息
语法:
expect 提示信息
3.send命令
作用:向交互式命令发送指令,向交互式命令发送指定信息
语法:
send 参数
案例:捕获passwd命令的输出,实现自动设置密码
如上图所示,是检测机器中是否含有expect工具,如果没有这个expect工具该去安装这个工具
首先先讲这个expect工具的使用方法
首先指定命令解释器,即#!/usr/bin/expect
如上图所示,就是先指定命令解释器,
然后使用spawn去指定什么命令,
expect去指定捕获这个命令输出的什么信息,
send去指定向交互式命令发送指令,
\n换行符,相当于回车
如上图所示,这些命令本身不是shell命令,如果拿bash去执行这个命令就会报错。
如上图所示,是如何执行expect 文件,以及验证expect是否执行成功的操作。
如上图所示,可以在expect文件中去设定等待捕获时间,当超过这个捕获时间之后,就结束捕获流程。
案例:结合shell脚本去使用
如上图所示,这是如何在shell脚本中去使用expect工具的示例
如上图所示,这是在shell脚本中执行expect工具实现交互式命令自动执行的操作。
案例:配置免密ssh
如上图所示,这是生成密钥的操作,
如上图所示,这是拷贝密钥的操作,在拷贝密钥的时候,需要输入目的主机的密码。
而这就是一个交互式命令,
将来这条命令在脚本的时候,我们就可以借助expect工具,去自动执行免密ssh的操作。
如上图所示,当192.168.183.10的机器第一次去连接192.168.183.11的机器的时候,需要捕获的信息的192.168.183.10的机器第二次去连接192.168.183.12的机器的时候,需要捕获的信息是不同的。
面对上面这个情况,怎么处理呢?
如上图所示,如果192.168.183.10的机器接收到对方机器的密钥信息之后,就会把密钥信息保存到这个文件中,所以我刚才去连接哪个183.11的时候,没有yes或者no的提示了。
如上图所示,为了方便expect信息的统一捕获,我们可以先把这个文件给删了。
如上图所示,可以在192.168.183.10的机器上写这样一个脚本文件,如果存在konwn_hosts就先把这个文件给删了,
如上图所示,可以在192.168.183.11的机器上创建密钥对
如上图所示,-f是指定私钥文件的存放地址,-N是指定私钥文件的密码
如上图所示,是创建密钥对的自动化操作。
如上图所示,是192.168.183.10对192.168.183.11的机器的免密ssh脚本。
如上图所示,此时192.168.183.10的机器能实现对192.168.183.11的免密操作。