本文简要介绍了expect工具语言的功能、用法,并以实例来具体说明

expect是什么

Expect是一个免费的编程工具语言,用来完成通信过程中的交互式任务,而无需人的干预。

通过shell虽然可以实现诸如循环、判断等控制流功能,但是在一些需要实现信息交互的场合,还是要通过人工干预来完成。为实现信息的交互,expect被发明,并不断随着时间的推移而功能日益强大。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl

安装expect

首先查看系统中是否有安装expect。

# whereis expect

Expect工具是依赖tcl的,所以也需要安装tcl。

首先下载并安装tcl,这里安装8.4.19版本。

# wget https://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz
# tar zxvf tcl8.4.19-src.tar.gz
# cd tcl8.4.19/unix && ./configure
# make
# make install

然后下载expect并安装。

# wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
# tar zxvf expect5.45.tar.gz
# cd expect5.45
# ./configure --with-tcl=/usr/local/lib --with-tclinclude=../tcl8.4.19/generic
# make
# make install
# ln -s /usr/local/bin/expect /usr/bin/expect

注意这里的configure命令需要使用–with-tclinclude选项传入tcl安装包中的generic文件夹路径。

安装完成之后运行expect命令,查看是否安装成功。

# expect
expect1.1>

基本操作

Expect脚本中常用的命令包括spawn, expect, send, interact等。

spawn shell-command

后面接的是我们要执行的shell命令,将启动一个子进程

expect “hi”

该命令从进程接受字符串”hi”,如果接受的字符串和期待的字符串不匹配,则一直阻塞,直到匹配上或者等待超时才继续往下执行

{send “hello\r”}

向进程发送字符串,与手动输入内容等效,当匹配到内容''hi"后输出“hello”,“\r”是代表是返回字符。

interact

该命令将控制权交给控制台,之后就可以进行人工操作了。通常用于使用脚本进行自动化登录之后再手动执行某些命令。如果脚本中没有这一条语句,脚本执行完将自动退出。

set timeout 30

设置超时时间timeout为30s,expect命令阻塞超时时会自动往下继续执行。将timeout配置为-1时表示expect一直阻塞直到与期待的字符串匹配上才继续往下执行。超时时间timeout默认为10s。

[lindex $argv n]

可以在脚本中使用该命令获取在脚本执行时传入的第n个参数。这里argv为传入的参数,另外argv为传入的参数,另外argc表示传入参数的个数,$argv0表示脚本名字。

另外我们也可以使用[lrange $argv sn en]命令获取第sn到第en个参数。

实例参考

login.exp :

#!/usr/bin/expect
set ip [lindex $argv 0]
#这条命令是将变量ip的值设置为传入进来的第一个参数。[lindex $argv 0]表示的就是第一个参数的值
set port [lindex $argv 1]
#这条命令是将变量port的值设置为传入进来的第二个参数。[lindex $argv 1]表示的就是第二个参数的值
set passwd ""
spawn ssh $ip -p$port
#使用变量,这里使用的方法跟shell脚本一样
expect {
#匹配输出内容,返回内容,exp_continue表示继续执行下一步 "*password" {send "123456\r"}
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$passwd\r"}
}
interact
#执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为[expect eof]

操作如下:

[root@localhost shell]# cat login.exp

[root@localhost shell]# ./login.exp 192.168.2.11 22 #多个参数直接以空格间隔,第一个参数:192.168.2.11 第二个参数22

本文由以下文章整理而来:

Expect工具的安装及使用方法

通过expect工具实现自动化管理

expect安装和使用

expect——通过编写自动化脚本实现信息交互(整理)的更多相关文章

  1. Python+Appium自动化测试(3)-编写自动化脚本

    之前一篇博客已经讲述怎样手动使用appium-desktop启动测试机上的app,但我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就尝试写Python脚本启动app并登 ...

  2. 实践作业2:黑盒测试实践——编写自动化脚本并拍摄测试过程视频 Day 6

    下午下课之后小组成员一起交流了一下实验过程遇到的一些问题,并汇总了下各个项目完成情况 该实验目前(写博客是时间)基本完成,具体情况如下 (1)分析系统需求 .(done) (2)设计测试用例.(don ...

  3. selenium+python编写自动化脚本时,定位frame中对象操作

    在web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B.switchTo().frame方法可以把当前定位的主题切换到fr ...

  4. 使用pycharm编写自动化脚本

    1.:导入本地Python环境 2:安装Selenium 3:下来需要根据安装的浏览器版本,下载合适的chromedriver驱动程序. 4:接着需要将下载的chromedriver进行解压,并将文件 ...

  5. Linux - 通过expect工具实现脚本的自动交互

    目录 1 安装expect工具 2 expect的常用命令 3 作用原理简介 3.1 示例脚本 3.2 脚本功能解读 4 其他脚本使用示例 4.1 直接通过expect执行多条命令 4.2 通过she ...

  6. linux软件管理之------编译安装nginx服务器并手动编写自动化运行脚本

    红帽系列的 linux软件管理分为三类:1. rpm 安装软件.2. yum 安装软件.3. 源码包编译安装.前面两种会在相关专题给出详细讲解.源码包的编译安装是非常关键的,我们知道linux的相关版 ...

  7. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  8. java+selenium自动化脚本编写

    实训项目:创盟后台管理,页面自动化脚本编写 使用工具:java+selenium 1)java+selenium环境搭建文档 2)创盟项目后台管理系统链接 java+selenium环境搭建 一.Se ...

  9. appium-desktop录制脚本二次开发,生成我司自动化脚本

    目的 通过对appium-desktop脚本录制功能进行二次开发,使录制的java脚本符合我司自动化框架要求. 实现步骤 1.增加元素名称的输入框 由于ATK(我司自动化测试框架)脚本中元素是以“ap ...

随机推荐

  1. [Java] Spring boot 的maven设置阿里云仓库

    Spring boot 的maven设置阿里云仓库 打开根目录下的 pom.xml 文件,在对应为止出加入如下 红色 代码: <build> <plugins> <plu ...

  2. luoguP3374 【模板】树状数组 1 cdq

    链接 luogu 思路 可耐我连cdq都不会,Orz 陈丹琦 代码 #include <bits/stdc++.h> using namespace std; const int N = ...

  3. A@G!C005

    AGC005 A STring 不会,有没有老鸽蕉蕉我/kk/kel/dk https://agc005.contest.atcoder.jp/submissions/7926986 B Minimu ...

  4. linux命令之------touch命令

    touch命令 1)    作用:用于修改文件或目录的时间属性,包括存取时间和更改时间.若文件不存在,系统会建立一个新的文件. 2)    -a:改变档案的读取时间记录: 3)    -m:改变档案的 ...

  5. Comet OJ - Contest #15 题解

    传送门 \(A\) 咕咕 const int N=1005; int a[N],n,T; int main(){ for(scanf("%d",&T);T;--T){ sc ...

  6. 关于windows使用git警告LF will be replaced by CRLF

    由于windows平台的换行符是CRLF,但是我们引用别人的类库可能是在unix平台开发的,那么代码中的换行符是LF,而git默认会做这个转换,所以在用git提交这些代码时会有警告:LF will b ...

  7. mysql数据库数据入库时间跟当前时间差了8个小时

    vim /etc/my.cnf[mysqld]default-time_zone = '+8:00'重启mysql服务./etc/init.d/mysqld restart 未测试

  8. poi导出word表格

    代码如下: package com.ksource.pwlp.util; import java.io.FileOutputStream; import java.math.BigInteger; i ...

  9. eclipse中maven依赖的jar源码中文注释乱码解决

    通过maven下载源代码,在eclipse中浏览源代码时,发现中文注释为乱码的问题. eclipse默认编码造成的问题.可以通过以下方法解决: 1.修改Eclipse中文本文件的默认编码:window ...

  10. 动态查找之二叉树查找 c++实现

    算法思想 二叉搜索树(又称二叉查找树或二叉排序树)BST树 二叉查找树 二叉查找树,也称二叉搜索树,或二叉排序树.其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左 ...