Expect工具介绍
Expect 是一个用于自动化控制交互式应用程序的工具,它是由 Don Libes 创建的,作为 Unix 和类 Unix 系统上的一个扩展工具。Expect 使用了 Tcl(Tool Command Language)作为脚本语言,它可以用来自动化那些通常需要人工参与的命令行任务。
Expect 的主要特点和用途包括:
1、自动化交互:Expect 可以模拟用户输入来自动执行交互式命令,比如 ssh 登录、ftp 上传/下载、passwd 更改密码等。
2、脚本语言:Expect 是基于 Tcl 语言的,这意味着它可以利用 Tcl 的编程特性来编写复杂的自动化脚本。
3、模式匹配:Expect 通过匹配程序输出来决定下一步的操作。它等待特定的字符串出现在输出中,然后根据预定义的脚本响应它们。
4、控制多个进程:Expect 可以同时与多个进程进行交云,使得自动化更加强大和灵活。
5、超时处理:Expect 允许设置超时,以避免脚本无限期等待响应。
6、调试支持:Expect 提供了调试工具,帮助开发者理解脚本中的问题。
Expect 的典型应用场景包括:
自动化系统管理任务:比如自动备份、批量更新密码等。
软件测试:自动化测试交云式软件。
网络自动化:自动化配置网络设备,执行远程脚本等。
总之,Expect 是一个非常有用的工具,可以极大地减少重复性的交互式命令操作,提高管理员和开发者的工作效率。
安装
一般Linux的镜像都会有expect安装包,使用镜像配置yum源后即可安装
yum -y install expect
常用命令
spawn:交互程序开始,执行后面的命令或程序,需要进入到 expect 环境才可以执行,不能直接在 shell 环境下执行
expect:从交互程序进程中指定接收信息,如果匹配成功,就执行send的指令交互;否则等待 timeout 后自动退出 expect 语句
send:如果匹配到 expect 接收到的信息,就将 send 中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查
exp_continue:在expect中多次匹配就需要用到
exit:退出expect脚本
expect eof:spawn进程结束后会向expect发送eof,接收到eof代表该进程结束
set:定义变量
$argv:expect脚本可以接收 bash 的外部传参,可以使用[lindex $argv n],n为0表示一个传参,为1表示第二个传参,以此类推
set timeout:设置超时时间,防止ssh远程主机网络不可达时卡住或远程主机执行命令卡住,如果设置为-1代表不会超时
基本语法
vim test.exp
#!/usr/bin/expect #expect解析器,与shell中#!/bin/bash类似
set timeout 2 #设置超时时间n秒,表示下面的代码需在n秒钟内完成,如果超时则退出
set ip [lindex $argv 0] #设置变量,ip地址从外部脚本传入
spawn ssh username@ip #执行命令,ssh远程登录主机
expect { #接收执行命令的返回信息
"yes/no" { send "yes\r"; exp_continue } #匹配到"yes/no",发送yes指令并回车执行
"password:" { send "password\r" } #匹配到"password:",发送密码并回车
expect"]*" #匹配到"]*",发送需要执行的命令并回车
send "df -h\r" #发送需要执行的命令
send "exit\r" #执行命令后退出BASH
expect eof #执行后结束
shell脚本传参给expect
vim test.sh
#!/bin/bash
for i in `cat iplist` #批量执行涉及多个主机ip,使用for循环获取ip
do
ip=$i
./test.exp $ip #将ip传参到expect脚本当中
done