Expect由Don Libes于1990年开发,作为Tcl(Tool Command Language)脚本语言的一个扩展,它极大地简化了与交互式软件的自动化交互过程
无论是telnet、ftp、passwd、fsck、rlogin、tip还是ssh等应用,Expect都能通过模拟用户输入,实现自动化控制
本文将详细介绍Expect的工作原理、基本语法及其在自动化任务中的实际应用
一、Expect简介 Expect是一个免费的编程工具语言,专门用于实现自动和交互式任务进行通信,而无需人的干预
Don Libes在创建Expect时,将其定义为“一个用来实现自动交互功能的软件套件”
通过Expect,系统管理员可以创建脚本,用于对命令或程序提供输入,这些输入通常是需要手工进行的
Expect则可以根据程序的提示模拟标准输入,从而自动化执行交互程序
Expect依赖于Tcl编程语言的支持,因此在使用Expect之前,必须先安装Tcl
从最简单的层次来说,Expect的工作方式就像一个通用化的Chat脚本工具
Chat脚本最早用于UUCP网络内,用于实现计算机之间建立连接时的特定登录会话自动化
Chat脚本由一系列expect-send对组成,expect等待输出特定的字符(通常是一个提示符),如果等到了就使用send发送特定的响应
二、Expect的工作原理 Expect的核心在于其自动化交互的能力
它通过Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制
具体来说,Expect的工作流程如下: 1.启动进程:使用spawn命令启动一个需要交互的进程
2.等待输出:使用expect命令等待进程的输出中出现特定的字符串或模式
3.发送响应:一旦匹配到特定的输出,使用send命令发送预设的响应给进程
4.继续交互:使用exp_continue命令继续等待下一个特定的输出,或者在没有更多交互时结束进程
通过这种方式,Expect能够模拟用户与程序的交互过程,实现自动化控制
三、Expect的基本语法 Expect脚本的编写需要掌握一些基本的语法和命令
以下是一些关键的语法元素: 1.脚本解释器: bash !/usr/bin/expect 这一行告诉操作系统使用Expect来解释该脚本
2.设置超时时间: tcl set timeout 30 设置expect命令的超时时间为30秒,默认是10秒
3.启动进程: tcl spawn ssh user@hostname 使用spawn命令启动一个ssh进程
4.等待输出并发送响应: tcl expect password: send yourpasswordn 等待输出中出现password:字符串,然后发送密码
5.结束交互: tcl expect eof 表示结束交互,等待进程退出
四、Expect的实际应用 Expect在自动化任务中有着广泛的应用,以下是一些具体的实例: 1.自动登录SSH服务器: tcl !/usr/bin/expect set timeout 30 spawn ssh test@127.0.0.1 expect password: send 123456n interact 这个脚本实现了自动登录SSH服务器的功能
它首先设置超时时间为30秒,然后使用spawn命令启动ssh进程,接着等待输出中出现password:字符串,并发送密码123456
最后,使用interact命令将控制权交给用户,保持在交互状态
2.自动执行git pull: tcl !/usr/bin/expect set timeout 30 se