expect的基本用法
上一篇 / 下一篇 2012-01-13 18:20:41 / 个人分类:liunx相关
文章来源
- 文章来源:【转载】
一、概述
XT C(k+f7A'G051Testing软件测试网Gl)zo*j"q&p$C4B.r
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。 51Testing软件测试网^%] hI]3T
.A*l1JdD(^0Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。 :) 51Testing软件测试网6Ho V0w)V4Z*{II
M)Q,d\ Gw&VE0Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。
EB,yLeE%k0
2I]r?o`4V {;v0
2hO~,T-\iDn0二、Expect工作原理 51Testing软件测试网G(^#]OvzUK#W
2b(N)|2~%xD @(A1w2\0从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。 51Testing软件测试网s ?B&m@k
'E2{E$J{5IA JW"W0Chat脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。例如下面的Chat脚本实现等待标准输出出现Login:字符串,然后发送somebody作为用户名;然后等待Password:提示符,并发出响应sillyme。
T9ZvZx,]f0
\-D6~ _y e+t1F0
$I1S2{2mu6DQ y-dq0引用:Login: somebody Password: sillyme
J-~(A4o%Y3t9QO0
qQI%GCL7Re&O[051Testing软件测试网^ T4n_6cMU$`KB
51Testing软件测试网?)V ^1DhyFb u
这个脚本用来实现一个登录过程,并用特定的用户名和密码实现登录。 51Testing软件测试网1n*n+O {a d
51Testing软件测试网sh8ng$?7R
Expect最简单的脚本操作模式本质上和Chat脚本工作模式是一样的。
d"PXo#b9v051Testing软件测试网#Yh/K-JS _
例子: 51Testing软件测试网D7X%RI.Mx
1、实现功能
L8i O4oV"m0下面我们分析一个响应chsh命令的脚本。我们首先回顾一下这个交互命令的格式。假设我们要为用户chavez改变登录脚本,要求实现的命令交互过程如下: 51Testing软件测试网ka,@2_t)@WK:R
51Testing软件测试网QZ C9Q+[!rY,\eH
引用:# chsh chavez 51Testing软件测试网;K,ime6kQRAZiN
Changing the login shell for chavez
Q@ _-[+YG q7D,{`0Enter the new value, or press return for the default 51Testing软件测试网 \(A OJ9Q%l0J
Login Shell [/bin/bash]: /bin/tcsh 51Testing软件测试网x*X'[hE&Mr8_4g2hW
#
0q/F,{p:@c0
h/caR6B#[ {S0可以看到该命令首先输出若干行提示信息并且提示输入用户新的登录shell。我们必须在提示信息后面输入用户的登录shell或者直接回车不修改登录shell。 51Testing软件测试网.I|*lQ!d@wQ
LR,spR'[)n-hi0
/bM]0r/b9A.j'H:|"QW02、下面是一个能用来实现自动执行该命令的Expect脚本:
7LsU"w1YQE0
!Hq@1@8?@5R0
Oyij1}7w+O]0这个简单的脚本可以解释很多Expect程序的特性。和其他脚本一样首行指定用来执行该脚本的命令程序,这里是/usr/bin/expect。程序第一行用来获得脚本的执行参数(其保存在数组$argv中,从0号开始是参数),并将其保存到变量user中。 51Testing软件测试网 d7l y%F1Eg2r
51Testing软件测试网c"ODGS!B(q
第二个参数使用Expect的spawn命令来启动脚本和命令的会话,这里启动的是chsh命令,实际上命令是以衍生子进程的方式来运行的。 51Testing软件测试网}!]+W%N-k\U`
51Testing软件测试网-f0r.}q$w\~R d*|4_
随后的expect和send命令用来实现交互过程。脚本首先等待输出中出现]:字符串,一旦在输出中出现chsh输出到的特征字符串(一般特征字符串往往是等待输入的最后的提示符的特征信息)。对于其他不匹配的信息则会完全忽略。当脚本得到特征字符串时,expect将发送/bin/tcsh和一个回车符给chsh命令。最后脚本等待命令退出(chsh结束),一旦接收到标识子进程已经结束的eof字符,expect脚本也就退出结束。 51Testing软件测试网*}m9qIo-A
%G6B_@^4w ow03、决定如何响应 51Testing软件测试网:Yz iS'D
51Testing软件测试网1d#ZA r;a_
管理员往往有这样的需求,希望根据当前的具体情况来以不同的方式对一个命令进行响应。我们可以通过后面的例子看到expect可以实现非常复杂的条件响应,而仅仅通过简单的修改预处理脚本就可以实现。下面的例子是一个更复杂的expect-send例子:
"bz(M)B mn/G/f051Testing软件测试网}Xu*HX9R
XT C(k+f7A'G051Testing软件测试网Gl)zo*j"q&p$C4B.r
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。 51Testing软件测试网^%] hI]3T
.A*l1JdD(^0Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。 :) 51Testing软件测试网6Ho V0w)V4Z*{II
M)Q,d\ Gw&VE0Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。
EB,yLeE%k0
2I]r?o`4V {;v0
2hO~,T-\iDn0二、Expect工作原理 51Testing软件测试网G(^#]OvzUK#W
2b(N)|2~%xD @(A1w2\0从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。 51Testing软件测试网s ?B&m@k
'E2{E$J{5IA JW"W0Chat脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。例如下面的Chat脚本实现等待标准输出出现Login:字符串,然后发送somebody作为用户名;然后等待Password:提示符,并发出响应sillyme。
T9ZvZx,]f0
\-D6~ _y e+t1F0
$I1S2{2mu6DQ y-dq0引用:Login: somebody Password: sillyme
J-~(A4o%Y3t9QO0
qQI%GCL7Re&O[051Testing软件测试网^ T4n_6cMU$`KB
51Testing软件测试网?)V ^1DhyFb u
这个脚本用来实现一个登录过程,并用特定的用户名和密码实现登录。 51Testing软件测试网1n*n+O {a d
51Testing软件测试网sh8ng$?7R
Expect最简单的脚本操作模式本质上和Chat脚本工作模式是一样的。
d"PXo#b9v051Testing软件测试网#Yh/K-JS _
例子: 51Testing软件测试网D7X%RI.Mx
1、实现功能
L8i O4oV"m0下面我们分析一个响应chsh命令的脚本。我们首先回顾一下这个交互命令的格式。假设我们要为用户chavez改变登录脚本,要求实现的命令交互过程如下: 51Testing软件测试网ka,@2_t)@WK:R
51Testing软件测试网QZ C9Q+[!rY,\eH
引用:# chsh chavez 51Testing软件测试网;K,ime6kQRAZiN
Changing the login shell for chavez
Q@ _-[+YG q7D,{`0Enter the new value, or press return for the default 51Testing软件测试网 \(A OJ9Q%l0J
Login Shell [/bin/bash]: /bin/tcsh 51Testing软件测试网x*X'[hE&Mr8_4g2hW
#
0q/F,{p:@c0
h/caR6B#[ {S0可以看到该命令首先输出若干行提示信息并且提示输入用户新的登录shell。我们必须在提示信息后面输入用户的登录shell或者直接回车不修改登录shell。 51Testing软件测试网.I|*lQ!d@wQ
LR,spR'[)n-hi0
/bM]0r/b9A.j'H:|"QW02、下面是一个能用来实现自动执行该命令的Expect脚本:
7LsU"w1YQE0
!Hq@1@8?@5R0
#!/usr/bin/expect51Testing软件测试网3r^-i:z$xB(W_l51Testing软件测试网JIN1@3tBW
# Change a login shell to tcsh51Testing软件测试网;v)z-yR ~.K
51Testing软件测试网 oc1KIq!Y f^)kV
set user [lindex $argv 0]
Kl!J(xgujlp1e0spawn chsh $user51Testing软件测试网9rSjz6WN!X s
expect "]:"
] H4q-K OHf0send "/bin/tcsh "
hoaJo JQ0expect eof
0bt K foW#z0exit
Oyij1}7w+O]0这个简单的脚本可以解释很多Expect程序的特性。和其他脚本一样首行指定用来执行该脚本的命令程序,这里是/usr/bin/expect。程序第一行用来获得脚本的执行参数(其保存在数组$argv中,从0号开始是参数),并将其保存到变量user中。 51Testing软件测试网 d7l y%F1Eg2r
51Testing软件测试网c"ODGS!B(q
第二个参数使用Expect的spawn命令来启动脚本和命令的会话,这里启动的是chsh命令,实际上命令是以衍生子进程的方式来运行的。 51Testing软件测试网}!]+W%N-k\U`
51Testing软件测试网-f0r.}q$w\~R d*|4_
随后的expect和send命令用来实现交互过程。脚本首先等待输出中出现]:字符串,一旦在输出中出现chsh输出到的特征字符串(一般特征字符串往往是等待输入的最后的提示符的特征信息)。对于其他不匹配的信息则会完全忽略。当脚本得到特征字符串时,expect将发送/bin/tcsh和一个回车符给chsh命令。最后脚本等待命令退出(chsh结束),一旦接收到标识子进程已经结束的eof字符,expect脚本也就退出结束。 51Testing软件测试网*}m9qIo-A
%G6B_@^4w ow03、决定如何响应 51Testing软件测试网:Yz iS'D
51Testing软件测试网1d#ZA r;a_
管理员往往有这样的需求,希望根据当前的具体情况来以不同的方式对一个命令进行响应。我们可以通过后面的例子看到expect可以实现非常复杂的条件响应,而仅仅通过简单的修改预处理脚本就可以实现。下面的例子是一个更复杂的expect-send例子:
"bz(M)B mn/G/f051Testing软件测试网}Xu*HX9R
expect -re "\[(.*)]:"
8xY/nV;^+\]+o1~0if {$expect_out(1,string)!="/bin/tcsh"} {