在日常使用Linux系统中,经常会碰到需要与系统进行交互的情况,此时expect就可以派上用场了,expect命令可以实现人机交互,无需人工操作,通过expect即可实现自动交互
expect用法选项:
-
-c : 从命令行执行expect脚本,默认expect是交互地执行的
-
-d : debug模式,可以在运行时输出一些诊断信息
-
-D 启用交换调式器,可设一整数参数
-
-f 从文件读取命令,仅用于使用#!时
-
-i 交互式输入命令,使用"exit"或"EOF"退出输入状态
-
-v 显示expect版本信息
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
安装expect
安装expect有两种方法,如下:
1、直接通过yum来安装,可以执行命令如下:
yum -y install expect tcl #expect依赖tcl,因此必须安装tcl
2、通过二进制包安装,首先需要下载expect、tcl 包,如下:
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
编译安装tcl,如下:
cd tcl8.4.11/unix
./configure --prefix=/usr/local/tcl --enable-shared
make && make install
安装完成后,进入源代码目录,将unix下面的tclUnixPort.h拷贝到上一级目录的generic目录中,如图:
编译安装expect,如下:
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中
1、将expect嵌套进入bash中
例1:下面的脚本实现的功能是自动修改root密码,本脚本以bash脚本为基础,添加expect解释器,如图:
-
第3行:定义密码
-
第4行:定义expect解释器
-
第5行:定义变量,要修改的用户
-
第8行:通过exp_continue来循环执行expect,可以简化写法,要不就要写多个expect
脚本运行结果如图:
例2:下面的脚本登录远程机器,并查看远程机器的磁盘空间,如图:
-
第9行:查看远程机器的磁盘空间
-
第11行:退出远程机器回到本机
-
第12行:通过expect eof 确保命令完全结束并收集整个输出,如果不加这个参数看不到exit过程
脚本运行结果如图:
注意:如果需要等待命令完全结束,确保收集整个输出,再做下一步操作,expect eof 是必要的
例3:下面使用expect -c来执行命令,如图:
注意:最外层是单引号,如果不用单引号而用双引号,那么里面的双引号就要转义
2、直接使用expect作为解释器
例1:下面定义expect脚本,实现远程登录其他linux机器,如图:
-
第1行:定义脚本解释器为expect
-
第2行:要执行的ssh命令
-
第3行:定义匹配规则,因为有两次要执行,因此需要使用exp_continue,在第一个规则匹配完成后在循环一次匹配第二条规则
-
第7行:interact表示任务执行完成后继续执行手动交互,如果不加interact,那么登录到远程机器后还会关闭连接,回到本机,如果加了interact后,登录远程机器后就会保留在远程机器终端,等待进一步手动交互
-
r:表示回车
expect解释器的脚本,执行的时候也要通过expect来执行,如图:
从上图可以看出,已经成功登录到远程主机,如果登录了远程机器后,我们还想要执行一些命令,此时可以修改脚本,添加如下:
-
expect “*#”:登录远程机器后匹配到终端
-
send:在终端发送字符串来执行命令
执行结果如下:
注意看,上面的文件名是ssh_expect.sh,除了可以使用sh作为后缀外,也可以将名称定义为ssh_expect.expect,用expect作为后缀
上面就是expect的基本用法,可结合shell脚本来实现更多功能,可自行探索下
注意:如果是将expect嵌套进入bash中,那么执行的时候按照bash的方法执行,否则将会出现错误,如果直接用expect解释器,那么执行的时候就用expect命令来执行,不能用bash来执行,否则也会出现错误
发表评论