expect工具详解:自动化处理交互式命令的利器
expect工具详解:自动化处理交互式命令的利器
一.expect工具介绍
在写脚本的过程当中不可避免的需要去写交互式命令。那么如何让交互式命令在脚本中自动执行?使用expect工具。expect工具的作用是捕获交互式的输出,自动执行交互式命令。
1.spawn命令
作用:指定捕获哪个命令的输出,即指定捕获哪个交互式命令。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的免密操作。