EXPECT_语法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Expect 语法
接触 Expect 是迫不得已。系统管理员在工作中经常会遇到这样的问题,需要实现一个 自动交互的工具,这个工具可以自动 Telnet 或者 Ftp 到指定的服务器上,成功 login 之后自 动执行一些命令来完成所需的工作。
当然,有很多编程语言可以去解决此类问题,比如用 C、Perl、或者 Expect。
accho console login: root Password: Last login: Sat Nov 13 17:01:37 on console Sun Microsystems Inc. SunOS 5.9 May 2004 #
Login Successfully...
# uname -p sparc # ifconfig -a lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
}
}
proc do_exec_cmd {} {
set timeout 5 send "n" expect "#"
send "uname -pn" expect "#" send "ifconfig -an" expect "#" send "exitn" expect "login:"
send_user "nnFinished...nn"
% set arr(2) 1 1 这样就建立了一个两个元素的数组 arr。在 TCL 中,不存在相当于数组边界这样的东西 ,例如 % set arr(100) to to 这时数组中实际只存在 arr(1),arr(2)和 arr(100),这是和 C 语言不同的地方。用 arr ay size 命令可以返回数组的大小: % array size arr 3 访问数组的方法和访问标两实际是一样的,例如: % puts $arr(100) to 可以用同样的方法创建多维数组。 要使用数组中的所有元素,需要使用一种特殊的便利方式。首先要启动 startsearsh: % array startsearch arr s-1-arr 这里返回了一个搜索 id,你可以把它传递给某个变量,因为以后还要使用它进行进一 步的搜索: % set my_id [array startsearch arr] s-1-arr 现在 my_id 的内容是 s-1-arr,然后,就可以搜索 arr 的内容了: % array nextelement arr $my_id whi
if {$argc<2} { puts stderr "Usage: $argv0 login passwaord.n " exit 1
}
2. 输入输出
puts stderr "Usage: $argv0 login passwaord.n " 3. 嵌套命令
set LOGIN [lindex $argv 0] set PASS [lindex $argv 1] 4. 命令调用
关于 Tcl 和 Expect 的语法,请参考 Unix/Linux 平台任务的自动化相关部分。
例 1:下面是一个 telnet 到指定的远程机器上自动执行命令的 Expect 脚本,该脚本运 行时的输出如下:
# /usr/bin/expect sample_login.exp root 111111 spawn telnet 10.13.32.30 7001 Trying 10.13.32.30... Connected to 10.13.32.30. Escape character is '^]'.
inet 127.0.0.1 netmask ff000000 eri0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
inet 10.13.22.23 netmask ffffff00 broadcast 10.13.22.255 ether 0:3:ba:4e:4a:aa # exit
这里的 array nextelement 返回的是什么?可能有点出乎你的意料,是 arr 数组的下标 ,再执行一次 array nextelement 命令又会找出另外一个下标: % array nextelement arr $my_id 4 这样遍历下去,可以找出 arr 数组的所有下标,而知道下标之后,就可以用$arr(4)之 类的方式访问 arr 的内容了。当遍历完成之后,array nextelement 命令将简单地返回:
显然,尽管 C 是无所不能的,但是解决此类问题还是比较困难,除非你熟悉 Telnet 或 者 Ftp 协议。
曾经见过别人用 C 实现了一个简单的 Telnet 客户端协议的程序,可以在这个程序加入 自己的代码来捕获服务端的输出,根据这些输出来发送适当的指令来进行远程控制。
使用 Perl 一样可以实现这样的功能,然而,Expect 做的更出色,而且除支持 Unix/Linux 平台外,它还支持 Windows 平台,它就是为系统管理和软件测试方面的自动交互类需求而 产生的:
}
if {$argc<2} {
puts stderr "Usage: $argv0 login passwaord.n " exit 1 }
set LOGIN [lindex $argv 0] set PASS [lindex $argv 1]
spawn telnet 10.13.32.30 7001
% set i 1 1 字符串应该用引号括起来: % set str "test" 'test' 要输出一个标量的内容,使用 put 语句: % puts $str test $用来说明 str 是一个变量。puts 函数在标准输出显示变量的内容。 数组也可以用 set 语句定义,实际上,tcl 中建立数组只是单个建立数组的元素。例如 , % set arr(1) 0 0
Expect 是一个免费的编Biblioteka Baidu工具语言,用来实现自动和交互式任务进行通信,而无需人 的干预。
Expect 的作者 Don Libes 在 1990 年开始编写 Expect 时对 Expect 做有如下定义:
Expect 是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。
accho console login:
F in ished...
下面是该脚本的源代码:
# vi sample_login.exp:
proc do_console_login {login pass} {
set timeout 5 set done 1 set timeout_case 0
while ($done) { expect { "console login:" { send "$loginn" } "Password:" { send "$passn" } "#" { set done 0 send_user "nnLogin Successfully...nn" } timeout { switch -- $timeout_case { 0 { send "n" } 1{ send_user "Send a return...n" send "n" } 2{ puts stderr "Login time out...n" ex it 1 } } incr timeout_case } }
% set str1 "test " test % set str2 "cook it" cook it % append str1 $str2 " and other" test cook it and other string 命令可以执行字符串的比较,删除和查询,其格式是 string [参数] string1 [string2]
spawn telnet 10.13.32.30 7001 5. 函数定义和调用
proc do_console_login {login pass} {
..............
}
6. 变量赋值
set done 1
7. 循环
while ($done) {
................
} 8. 条件分支 Switch
do_console_login $LOGIN $PASS do_ex ec _c md
close
exit 0
上面的脚本只是一个示例,实际工作中,只需要重新实现 do_exec_cmd 函数就可以解 决类似问题了。
在例 1 中,还可以学习到以下 Tcl 的语法:
1. 命令行参数
$argc,$argv 0,$argv 1 ... $argv n
Expect 语言是基于 Tcl 的, 作为一种脚本语言,Tcl 具有简单的语法:
cmd arg arg arg 一条 Tcl 命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的 是命令参数 . $foo $符号代表变量的值. 在本例中, 变量名称是 foo. [cmd arg] 方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外 一个命令的参数, 那么你使用这个符号 . "some stuff" 双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解 释. {some stuff} 大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解
switch -- $timeout_case { 0{ ............... } 1{ ............... } 2{ ...............
} } 9. 运算 incr timeout_case
此外,还可以看到 Expect 的以下命令: send ex pec t send_user 可以通过-d 参数调试 Expect 脚本: # /usr/bin/expect -d sample_login.exp root 111111
释.
反斜线符号() 是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用 来关闭"$"符号 , 引号,方括号和大括号的特殊含义 .
最好的学习方法就是边干边学,对于已经熟悉一种编程语言的人来说,用另一种新的语 言来写程序解决问题,是很容易的事。所以大概了解一下基本语法后,就一边动手解决问题, 一边查手册吧。
参数可以是下面的命令之一: compare 按照字典顺序对字符串进行比较,根据相对关系返回-1,0 或者+1。 first 返回 string2 中第一次出现 string1 的位置,如果失败,返回-1。 last 返回 string2 中最后一次出现 string1 的位置,如果失败,返回-1 trim 从 string1 中删除开头和结尾的出现在 string2 中的字符 trimleft 从 string1 中删除开头的出现在 string2 中的字符。 trimright 从 string1 中删除结尾的出现在 string2 中的字符 下面几个用在 string 中的参数不需要 string2 变量: length 返回 tring1 的长度 tolower 返回将 string1 全部小写化的串 toupper 返回将 string1 全部大写化的串 运算 TCL 的运算方式比较别扭,它使用 expr 命令作为计算符号,其用法类似 C 语言的+=和/= ,例如, % set j [expr $i/5] 1 注意 TCL 会自动选择整数或者浮点计算: % set l [ expr $i /4.0] 1.25 % set l [ expr $i /4] 1 在 TCL 里面可以使用+ - * /和%作为基本运算符,另外通常还包括一些数学函数,如 a bs,sin,cos,exp 和 power(乘方)等等。
% array nextelement arr $my_id % 这时就可以停止遍历过程了,如果你想确认遍历是否完成,可以使用 array anymore 命 令:
% array anymore arr $my_id 0 返回 0 说明遍历已经完成。 串处理 TCL 中可以进行一般的串处理过程,这可以使用 string 命令和 append 命令,append 命令 将某个字符串加到另外一个字符串的后面:
相关文档
最新文档