Shell expect命令介绍

一.交互

GUI应用程序中交互非常多,大都是基于事件来触发响应。比如,输入账号密码登录。基于事件响应的程序已经统治大家的桌面多年,这种方式的优点非常非常多,以至于至今都没有好的交互方式去撼动他的地位。不过完成这一系列动作触发都需要人的参与,比如鼠标,键盘,触摸板等。但有些场景我们想通过程序去完成这一系列重复的动作。比如自己去点击某个按钮1W次,程序自己打开浏览器,输入URL,账号密码,最后点击登录……这些实现起来貌似有点傻,本来就是给人用的程序,为什么要程序自己去用程序?

先不说傻不傻,如果你要实现这样的功能,无所不包的Python就能帮助你。实现自己输入账号密码触发登录,实现游戏自动打怪等……这样能节约测试人员的大量时间。

二.expect命令

GUI应用的场景太复杂,自动化测试有很大的局限性。当然这并不是今天要说的重点。

除了GUI程序的交互,我们还有命令行模式的交互。所谓命令行就是一问一答,有问必有答……问了不答就是程序出问题。常见的有Win下的CMD,Mac下的Terminal。

在命令行模式交互时我们也需要用到程序自己输入命令,自己登录,自己模仿人的行为处理事情。相比GUI就简单的多。今天说的expect命令就能帮我们实现各种交互。下面是自动登录服务器的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/expect -f
set timeout 10
set sig [lindex $argv 0] //获取第一个参数
if { "$sig" == "123" } { //判断
set host "121.41.34.23"
set user "root"
set pass "34a27d6c1ded"
set port "224455"

} elseif { "$sig" == "456" } {
set host "117.24.128.4"
set user "root"
set pass "121233!@#"
set port "2288"
}

spawn ssh -p $port $user@$host //拼接ssh命令
expect {
"yes/no" { send "yes\r";exp_continue }
"*password:" { send "$pass\r" } //正则匹配,输出代码
}
interact //交互
`