Expect的做者Don Libes在1990年开始编写Expect时对Expect作有以下定义:mysql
(Expect is a software suite for automating interactive tools。sql
Expect的官方主页对它做了以下介绍:shell
Expect is a tool for automating interactive applications such as telnet,数据库
ftp, passwd, fsck, rlogin, tip, etc. Expect really makes this stuffapp
trivial. Expect is also useful for testing these same applications. Andide
by adding Tk, you can also wrap interactive applications in X11 GUIs.函数
Expect是基于TCL的,做为一个脚本语言,expect能在无需管理员参与的状况下实现测试
自动交互(好比passwd,fsck,telnet等),expect也能用于自动测试一些应用程序。ui
expect的语法和shell的语法很是类似,它支持函数调用,有while语句,switchthis
语句。
1) expect使用spawn调用其余的执行程序,好比
spawn telnet 218.199.20.98 2600
可是在使用的过程当中发现spawn不支持管道和重定向,也就是说对于
ls |more ; mysql -p < update.sql 这样的命令spawn不能正确解析。
解决的办法是把这些命令放到一个shell脚本里面,在用spawn执行这个shell
脚本。
2) expect 建立子函数使用proc标志,也即:
proc functionname { parameter1,parameter2 } {
......
}
调用子函数很是简单
functionname $param1 $param2
3) expect 使用expect ,send 组合实现自动交互 ,语法以下:
expect {
"login;" { send "$user\n" }
"passwd:" { send "$passwd\n" }
}
使用send的使用后面的内容不显示给用户,如要显示给用户,应使用send_user
4) 注意点:
1. expect里面基本是都是使用{} 而不是使用(),好比函数参数输入外面应用{},
应该是while { } 而不是 while ( ).
2. { 应和其余符合有空格, expect { 正确,expect{ 就会报错.
3. spawn 不支持管道和重定向.
5) 下面是实现的mysql数据库自动更新的expect脚本:
proc do_console_login {pass} {
set timeout 5
set done 1
while { $done } {
expect {
"password:" {
send "$pass\n"
}
eof {
set done 0
}
}
}
}
if {$argc<1} {
puts stderr "Usage: $argv0 password.\n "
exit 1
}
set PASS [lindex $argv 0]
spawn /usr/local/mysql/data/updatemysql
do_console_login $PASS