linux命令之expect用法
在日常使用Linux系统中,经常会碰到需要与系统进行交互的情况,此时expect就可以派上用场了,expect命令可以实现人机交互,无需人工操作,通过expect即可实现自动交互。
expect用法选项:
- -c : 从命令行执行expect脚本,默认expect是交互地执行的
- -d : debug模式,可以在运行时输出一些诊断信息
expect主要参数说明如下:
- spawn:交互程序开始后面跟命令或者指定程序
- expect:获取匹配信息匹配成功则执行expect后面的程序动作
- send exp_send:用于发送指定的字符串信息
- exp_continue:在expect中多次匹配就需要用到,循环
- send_user:用来打印输出 相当于shell中的echo
- exit:退出expect脚本
- eof expect:等待执行结束,收集整个输出
- sleep:休眠指定秒数
- set :定义expect的变量
- puts: 输出变量
- set timeout :设置超时时间
- interact :允许用户交互,任务执行完成后允许手动执行后续命令
本例子中演示使用系统为Centos7
安装expcet
有两种方式可安装expect,如下:
1、直接通过yum来安装,可以执行命令如下:
yum -y install expect tcl #expect依赖tcl,因此必须安装tcl
2、通过软件包的方式进行安装
由于expect是基于tcl的基础上创建的,因此需要先安装tcl
首先下载tcl安装包,可以执行命令如下:
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
下载完成后解压软件,执行命令如下:

进入解压后的目录中,执行编译安装,命令如下:
cd tcl8.4.11/unix
./configure --prefix=/usr/local/tcl --enable-shared
make && make install
安装完成后,进入源代码目录,将unix下面的tclUnixPort.h拷贝到上一级目录的generic目录中,如图:

接下来安装expect,可通过wget命令下载此安装包,命令如下:
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
解压软件包,并进入解压目录,执行命令如下:

执行命令进行编译安装,命令如下:
cd expect5.45
./configure --prefix=/usr/local/expect --with-tcl=/usr/local/tcl/lib --with-tclinclude=../tcl8.4.11/generic
make && make install
注意:上方的编译安装的时候关联了tcl的源代码目录以及安装目录
安装完成后创建软连接,执行命令如下:
ln -s /usr/local/tcl/bin/expect /usr/bin/expect
在命令行输入expect后可以看到弹出如下图所示:

至此:expect安装完成。
编写测试脚本
编写expect脚本有两种方式,一种是直接使用expect作为脚本解释器,另一种是将expect嵌套进入bash中
一、将expect嵌套进入bash中
例子1:下面的脚本实现的功能是自动修改root密码,本脚本以bash脚本为基础,添加expect解释器,如图:

- 第3行:定义密码
- 第4行:定义expect解释器
- 第5行:定义变量,要修改的用户

注意:通过exp_continue来循环执行可以简化写法
2:下面的脚本登录远程机器,并查看磁盘空间,如图:

- 第9行:查看远程机器的磁盘空间
- 第11行:退出远程机器回到本机
- 第12行:通过expect eof 确保命令完全结束并收集整个输出,如果不加看不到exit过程
运行结果如下:

注意:如果需要等待命令完全结束,确保收集整个输出,再做下一步操作,expect eof 是必要的
3:下面使用expect -c来执行命令,如图:

注意:最外层是单引号,如果不用单引号而用双引号,那么里面的双引号就要转义
4、下面使用expect嵌套进入函数中来实现传递文件,如图:

二、直接使用expect作为解释器
例子1:下面定义expect脚本,实现远程登录其他linux机器,如图:

- 第1行:定义脚本解释器为expect
- 第2行:要执行的ssh命令
- 第3行:定义匹配规则,因为有两次要执行,因此需要使用exp_continue,在第一个规则匹配完成后在循环一次匹配第二条规则
- 第7行:interact表示任务执行完成后继续执行手动交互,如果不加interact,那么登录到远程机器后还会关闭连接,回到本机,如果加了interact后,登录远程机器后就会保留在远程机器终端,等待进一步手动交互
- \r:表示回车
expect解释器的脚本,执行的时候也要通过expect来执行,如图:

从上图可以看出,已经成功登录到远程主机
如果登录了远程机器后,我们还想要执行一些命令,此时可以修改脚本,添加如下:

- expect “*#”:登录远程机器后匹配到终端
- send:在终端发送字符串来执行命令
执行结果如下:



