Expect-自动化交互

简介:

目录:

1.什么是Expect?

2.Expect程序工作流程

3.安装expect软件

4.先看一个expect小实例

5.Expect语法

5.1 spwan

5.2 expect

5.3 exp send t send

5.4 exp continue

5.5 send user

5.6 exit

6.expect变量

7.Expect关键字

7.1 eof

7.2 timeout

8.生产场景expect实战

8.1 实战1:使用expect实现批量分在/etc/hosts文件

8.2 实战2:使用expect实现批量分发ssh密钥文件

8.3 实战3:使用expect实现批量查看客户机负载,内存

9.有关expect的说明

 

1.什么是Expect?

Expect是基于Tcl的相对简单的一个免费的脚本编程语言,用来实现自动和交互式任务程序进行通信,无需人的手工干预。如ssh,ftp等,这些程序正常情况都需要手工与它们进行交互,而使用expect就可以模拟人手工交互的过程,实现自己的无端的程序交互,从而达到自动化运维的目的。

Expect是一个用来实现自动交互功能的软件套件(Expect is a software suite for automaing interactive tools)

虽然,使用Cperl等一样可以实现这样的交互功能,然而expect做的更专业出色,简单,而且除支持unit/linux平台外,还支持windows,它就是为系统管理和软件测试方面的自动交互类需求而产生的。

 

2.Expect程序工作流程

Expect的工作流程可以理解为,spawn启动进程-->expect期待关键字-->send向进程发送字符-->退出结束

3.安装Expect软件

首先,配置好yum安装源,并且确保机器可以上网,然后执行yum instal expect -y即可安装expect软件。

安装完后查看结果:

    wKiom1brXmLzzPF-AAAHl__JPMk556.png

4.先看一个Expect小实例

#vim ssh164.exp  (注意后缀为exp)

#!/usr/bin/expect(指定解释此脚本的shell)

spawn ssh 192.168.50.164 /sbin/ifconfig eth0(spawn:指定要执行的语句)

set timeout 60(设定超时时长,意思是要连接的IP,指定时间内无响应时,自断开)

expect "*password:"(匹配交互式提示的字符)

send "happy52121\n"(设置发送密码)

expect eof()

exit(执行后退出)

       wKiom1brXpzRrMGaAAAdh9yFb3o493.png

#chmod 700 ssh164.ex (添加执行权限)

#./ssh164.exp(从下图可以看出,无需要输入密码自动执行成功)

#expect ssh164.exp(这种方法也可以执行成功,但不能用. ssh164.exp的,这种调用的解释器是bash

wKioL1brX2CSrDLnAAAtQyp9pAs994.png

5.Expect语法

Expect中的命令是最重要的部分了,命令的使用语法如下:

命令 [选项参数

5.1 spawn

Spawn命令是expect的初始命令,它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法执行了,spawn使用方法如下:

spawn命令后面,直接加上要启动的进程,命令等信息,除此之外,spawn还支持其它选项如:

-open 启动文件进程

-ignore忽略某些信号

5.2 expect

使用方法:

Expect 表达式 动作 表达式 动作 ....

Expect命令用于等候一个相匹配内容的输出,一旦匹配上就执行expect后面的动作或命令,这个命令接受几个特有的参数,用的最多的就是-re,表示使用正则表达式的方式匹配,使用起来就是这样:

spawn ssh root@192.168.50.164

expect password: { send 123456\r}   (后边是\r还是\n有待测试,貌似都可以,只要加特殊字符就行)

从上面的例子可以看出,expect是依附与spawn命令的,当执行ssh命令后,expect就匹配命令执行后的关键字:password:,如果匹配到关键字就会执行后面包含在{}括号中的send或者exp_send动作,匹配以及动作可以放在二行,这样就不需要使用{}括号了,就像下面这样,实际完成的功能与上面是一样的:

spawn ssh root@192.168.50.164

expect password:

send 123456\r(后边是\r还是\n有待测试,貌似都可以)

expect命令还有一种用法,它可以在一个expect匹配中多次匹配关键字,并给出处理动作,只需要将关键字放在一个大括号中就可以了,当然还要有exp_continue.

spawn ssh root@192.168.50.164

expect {

yes/no{ exp_send yes\r;exp_continue }

*password: { exp_send 123456\r}

}表示进行多次匹配,当匹配到第一次,还要进行第进行匹配时需要用到exp_continue

5.3 exp_sendsend

在上面的介绍中,我们已经看到了exp_send命令的使用,exp_send命令是expect中的动作命令,它还有一个可以完成同样工作的同胞:send;exp_send命令可以发送一些特殊符号,我们看到的\r(回车),还有一些其它的比如:\n(换行),\t(制表符)等等,这些都是tcl中的特殊符号相同

spawn ssh root@192.168.50.164

expect {

yes/no{ exp_send yes\r;exp_continue }

*password: { exp_send 123456\r}

}

5.4 exp_continue

这个命令一般用在动作中,它被使用的条件比较苛刻,看看下面的例子:

#!/usr/bin/expect

spawn ssh root@192.168.50.164 /sbin/ifconfig eth0

set timeout 60

expect {

        -timeout 5        (设置超时时间,意思是在指定时间不给出结果,就断开) 

        "yes/no" { exp_send "yes\r";exp_continue}

        "*password:" { exp_send "happy52121\r" };

        timeout { puts "expect was timeout by test.";return}    (当超时后,要打印出的内容)

expect eof

exit

在这个例子中,可以发现exp_continue命令的使用方法,首先它要处于一个expect命令中,然后它属于一种动作命令,完成的工作就是从头开遍历,也就是说如果没有这个命令,匹配第一个关键字以后就会继续匹配第二个关键字,但有了这个命令后,匹配第一个关键字以后,第二次匹配仍然从第一个关键字开始。

5.5 send_user

send_user命令用来把后面的参数输出到标准输出中去,默认的send,exp_send命令都是将参数输出到程序中的,用起来就像这样:

send_user Please input passwd:

这个语句就可以在标准输出中打印please input passwd:字符了。相当linux中的echo输出

5.6 exit

exit命令功能很简单,就是直接退出脚本,但是你可以利用这个命令对脚本做一些扫尾工作,比如下面这样:

exit -onexit {

exec rm $tmpfile(删除临时文件)

send_user Good bye\n (说再见,好玩)

}

wKioL1brX7iDEKkIAAAnDBfZ0EQ000.png

wKiom1brXzXCQk5lAABFIFhk5_M267.png

6.Expect变量

expect中有很多有用的变量,它们的使用方法与TCL语言中的变量相同,比如:

set变量名变量值   #设置变量的方法

puts $变量名#读取变量的方法

例:接收命令行的参数作为自定义变量

wKioL1brX_GxwC_sAACLuPV6iGQ654.png

7.Expect关键字

expect中的特殊关键字用于匹配过程,代表某些特殊含义或状态,一般用于expect族中命令中而不能在外面单独使用,也可以理解为事件,使用上类似于:

expect eof {}

7.1 eof

eof(end of file)关键字用于匹配结束符,比如文件的结束符,FTP传输停止等情况,在这个关键字后跟上动作来做进一步控制,特别是ftp交互操作方面,它的作用很大。用一个例子来看看:

spawn ftp anonymous@192.168.50.198

expect {

password: {exp_send who IM I}

eof {ftp connect close}

}

interact {}

7.2 timeout

timeoutexpect中的一个重要变量,它是一个全局性的时间控制开关,你可以通过为这个变量赋值来规定整个expect操作的时间,注意这个变量是服务与expect全局的,它不会纠缠于某一条命令,即使命令没有任何错误,到时间仍然会激活这个变量,但这个时间到达以后除了激活一个开关之外不会做其它的事情,如何处理脚本编写人员的事情,看看它的实际使用方法:

set timeout 60

spawn ssh root@192.168.50.198

expect password: {send word\r}

expect timeout {puts Expect was timeout;return}

上面的处理中,首先将timeout变量设置为60秒,当出现问题的时候程序可能会停止下来,只要到60秒就会激活下面的的timeout动作,这里我打印一个信息并且停止了脚本的运行------你可以做更多其它的事情,看自己的意思。

 

在另一种expect格式中,我们还有一种设置timeout变量的方法,看看下面的例子“

spawn ssh root@192.168.50.198

expect {

-timeout 60

-re password: {exp_send word\r}

-re TopsecOS# { }

timeout {puts Expect was timeout;return}

}

expect命令中间加上一个小横杠,也可以设置timeout变量

timeout变量中,设置为0表示立即超时,-1则表示永不超时。

8.生产场景Expect实战

a.把文件传递到某台主机的某个目录下,要向脚本传递3个参数

#!/usr/bin/expect

if {$argc!=3} {//判断命令行是否给到3个参数

        send_user "Usage:expect need three arguments lisk thks:file host dir\n"

        exit

}

set srcname [lindex $argv 0]//取到命令行的第1个参数,并传递给变量

set hostname [lindex $argv 1]//取到命令行的第2个参数,并传递给变量

set destname [lindex $argv 2]//取到命令行的第3个参数,并传递给变量

set password "123456"

spawn scp $srcname root@$hostname:$destname

set timeout 60

expect {

        -timeout 2

        "yes/no" {send "yes\r";exp_continue}

        "*password:" {send "happy52121\r"}

        timeout {puts "expect connect failure,please contact admin.";return}

}

expect eof

exit -onexit {

        send_user "Jobs has finished,Goodbye.\n"

}

       wKioL1brYDyRSlrYAABAarjNCE0357.png

       wKioL1brYE2g4mitAAAzev87UNM102.png       

       

b.使用expect实现批量分发/etc/hosts文件

在上面例子的基础上做一些修改,使其可以实现批量分发文件

#vim scp.sh

#!/bin/bash

iplist=(//把想要操作的IP,定义成一个数组,当然也可以单独写到一个文件中,调用时用`cat iplist`即可

        192.168.50.198

        192.168.50.164

        192.168.50.165

)

for ip in ${iplist[*]}//${iplist[*]}引用数组中的每一个元素

do

expect scp.exp /etc/fstab $ip /tmp

done

          wKiom1brYAKwBY7nAAATpNEcLkI270.png  

    #. scp.sh//可以看到定义的几台IP中,复制操作全部执行成功

          wKioL1brYMCBLFlMAABjzxp6uug482.png

        

再做一些修改使其更专业一点:通过调用/etc/init.d/functions

#vim scp.sh (///bin/ture,表示OK/bin/false表示FAILED,在开机启动的时候的你可以看到很多选项后都有)

        wKiom1brYFrjo9t1AAArQZ8IBtw757.png       

#. scp.sh   //这样看是不是要专业很多呢

  wKioL1brYRWCRN11AAAJiGyuZ_o989.png

  不过这样做会有一个问题,因为我在scp.exp文件中对连接超时的情况做过处理,这样造成的结果就是不存的IP 也会执行成功(我现在添加一个并不存在的IP192.168.50.256,果看结果也是OK

wKioL1brYVOB2BzSAAAJ0mizo0c883.png

所以此时就需要在scp.exp中,把连接超时的情况不做处理,这样在执行scp.sh时就会返回值为1

把超时处理的情况注释掉,可以看到那个不存的IP处理失败

        wKiom1brYPmAqcL1AAA-B91lNB0882.png

        wKiom1brYRqSj8p-AAAMqUARqho382.png

本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1752415如需转载请自行联系原作者


weilovepan520

相关文章
|
6月前
|
测试技术 UED Python
App自动化测试:高级控件交互技巧
Appium 的 Actions 类支持在移动应用自动化测试中模拟用户手势,如滑动、长按等,增强交互性测试。ActionChains 是 Selenium 的概念,用于网页交互,而 Actions 专注于移动端。在Python中,通过ActionChains和W3C Actions可以定义手势路径,例如在手势解锁场景中,先点击设置,然后定义触点移动路径执行滑动解锁,最后验证解锁后的元素状态。此功能对于确保应用在复杂交互下的稳定性至关重要。
|
6月前
|
测试技术 API Python
Appium控件交互策略:优化自动化测试效率的关键方法
该文介绍了如何使用Selenium与APP进行交互,包括点击、输入和状态判断等操作。例如,通过element.click()点击控件,element.send_keys()输入文本,以及element.is_displayed()检查元素是否可见。还展示了如何获取元素属性,如resource-id、text和class,并提供了Python代码示例来定位并操作APP元素,如滑动条的显示、可点击性检测及点击滑动条中心位置。在编写测试脚本时,应注意元素定位和状态验证以确保测试稳定性。
|
1月前
|
API 数据安全/隐私保护 开发者
使用MechanicalSoup进行网页自动化交互
使用MechanicalSoup进行网页自动化交互
|
3月前
|
存储 Linux 测试技术
在Linux中,如何使用expect进行自动化交互式应用程序测试?
在Linux中,如何使用expect进行自动化交互式应用程序测试?
|
3月前
|
Web App开发 敏捷开发 测试技术
自动化测试框架的设计与实现探索操作系统的心脏:内核与用户空间的交互
【8月更文挑战第26天】本文旨在探讨自动化测试框架的设计原则、核心组件和实现方法。通过分析自动化测试的优势,我们深入讨论了框架设计的关键考虑因素,包括模块化、可重用性、可扩展性和易维护性。文章还介绍了如何利用流行的测试工具和编程语言来实现一个高效的自动化测试框架,并通过实例展示了框架的应用。
|
6月前
|
安全 物联网 测试技术
构建未来:Android与IoT设备的无缝交互深入探索软件自动化测试的未来趋势
【5月更文挑战第30天】在物联网(IoT)技术快速发展的当下,Android系统因其开放性和广泛的用户基础成为了连接智能设备的首选平台。本文将探讨如何通过现代Android开发技术实现智能手机与IoT设备的高效、稳定连接,并分析其中的挑战和解决方案。我们将深入挖掘Android系统的底层通信机制,提出创新的交互模式,并通过实例演示如何在Android应用中集成IoT控制功能,旨在为开发者提供一套可行的指导方案,促进IoT生态系统的进一步发展。
|
5月前
|
Ubuntu 关系型数据库 MySQL
expect自动交互脚本:简化你的自动化任务
`expect` 是Linux自动化神器,用于模拟键盘输入与交互式应用自动交互,常用于自动登录服务器、执行命令。安装 `expect`(CentOS: `yum -y install tcl expect`, Ubuntu: `apt-get -y install expect`) 后,编写脚本如SSH登录示例,自动发送密码和命令。通过结合shell命令,`expect` 可实现复杂任务,如获取IP、登录MySQL。支持多服务器管理,根据用户输入选择登录。学习 `expect` 提升自动化效率!
234 0
|
6月前
|
JavaScript 前端开发 测试技术
MechanicalSoup,一个非常实用的 Python 自动化浏览器交互工具库!
MechanicalSoup,一个非常实用的 Python 自动化浏览器交互工具库!
72 9
|
6月前
|
NoSQL Shell 数据安全/隐私保护
搞定shell脚本expect自动化交互输入密码等就是这么简单
搞定shell脚本expect自动化交互输入密码等就是这么简单
449 0
|
Web App开发 Java Apache
如何在Selenium自动化Chrome浏览器中模拟用户行为和交互?
Selenium是一个用于自动化Web应用程序测试的工具,它可以模拟真实的用户在浏览器中进行各种操作,如点击、输入、滚动等。Selenium支持多种浏览器,如Chrome、Firefox、Edge等,但是每种浏览器都需要相应的驱动程序才能与Selenium进行通信。本文将介绍如何在Selenium中使用Chrome浏览器,并且设置代理服务器来避免被目标网站识别。
471 0
如何在Selenium自动化Chrome浏览器中模拟用户行为和交互?