Linux -- Expect Script入门
我们习惯于在Linux上使用shell脚本自动化一些重复性的人力工作,比如批量登录远程机器并执行指定命令,或者连接ftp服务器下载指定文件。这些场景下shell难以做到完全自动化,本质原因是ssh,ftp类似程序属于交互式程序,这些程序会交互式的期望用户输入信息并响应输入。因此expect诞生了,expect是一款专门控制交互式程序的程序,我们可以用expect模拟人与程序以及终端输出(stdout)的各种交互,从而节省大量重复性人力消耗,博主用的最多的就是自动通过跳板机登录开发机,然后切换到应用目录。
Expect命令
Command | 解释 |
---|---|
spawn | 通常用来启动给定程序进程,并开始与之交互,比如 spawn ssh user@host 启动ssh进程 |
expect | expect命令会等待程序输出,匹配规则为正则表达式,停止条件为匹配到指定输出,程序输出结束仍然未匹配,或者达到超时时间 |
expect_user | 对用户输入进行匹配,该指令会等待用户输入信息,然后按照指定模式将数据暂存到$expect_out数组变量中 |
send | 将字符串输入到当前进程,该命令是交互式核心,用于模拟用户输入信息 |
interact | 将当前进程的交互控制权转交给用户,转交给用户后,脚本不再继续执行 |
send_user | 将信息发送到stdout,用于给用户信息提示 |
set | 该指令既可以修改全局变量,比如set timeout 10 修改超时时间,也可以获取命令行参数并赋值set username [lindex $argv 0] 获取脚本参数 |
close | 关闭当前进程 |
[lindex $argv 0] | 获取脚本参数,0代表第一个参数,一般常配合set指令,这样后续脚本可以直接是用$xxx访问 |
一般一个简单的expect脚本通常是下列形式,首先指定shebang为expect程序,然后使用spawn启动交互式程序,使用expect确定启动成功,最后使用send发送要执行的命令。
1 |
|
Expect案例
Expect脚本更多的是通过实例学习,博主现在掌握的实例并不多,因此本文后续会将遇到的案例追加上来,以此作为样板,读者可以根据样例实现自己的自动化逻辑
简易登录ssh并执行命令
本案例从How to Learn The Basics of Expect Script?中摘抄出来,作为入门案例,描述了spawn,expect,send等指令的基本用法,详细分析写到注释中。
1 |
|
expect解析用户参数
这个案例是大多数程序的前提,我们假设要实现一个自动化脚本,该脚本需要用户输入 host,user,password三个变量,当用户没有输入user或者password的时候,需要主动提醒,让其输入。
该脚本的核心为 set 指令获取用户参数,以及使用 expect_user 匹配用户输入
1 |
|
更加完善的登录ssh判断
该脚本相较于第一个登录案例,增加了变量,以及异常情况判断,主要用到的是expect多分支匹配。这三个案例加起来,博主觉得足以满足绝大多数情况了,况且还可以将shell和expect配合使用,在shell中调用expect脚本,以达到更加灵活的操作。
1 |
|
参考
How to Learn The Basics of Expect Script?
- 版权声明: 感谢您的阅读,本文由屈定's Blog版权所有。如若转载,请注明出处。
- 文章标题: Linux -- Expect Script入门
- 文章链接: https://mrdear.cn/posts/linux-expect_script.html