expect命令是用于处理交互的。在实际应用中,我们可以将一些交互场景写在脚本上,达到自动化的目的。
下面先从一个例子入门。下面脚本主要功能是:远程登陆192.168.1.1->连接mysql->切换数据库->设置不自动提交。
#!/usr/bin/expect
spawn ssh -p 32200 192.168.1.1
send "mysql -uroot -p123456\r"
expect "mysql> "
send "use test\r"
send "set session autocommit=0;\r"
expect "mysql> "
interact
有兴趣的话,可以将上述代码保存到一个可执行文件中,并使用expect file.exp的方式运行。
指令介绍:expect常用的指令分别有:spawn、send、expect、interact、set。
spawn: 用于启动一个新的进程。
命令格式:spawn [spawn-args] program [program-args]
通常我们要通过spawn打开一个交互进程,如:ssh、ftp、scp之类,后面再通过send、expect命令与之交互。
send:
命令格式:send [-flags] string
通过send指令向进程发送一个字符串。如:send "uname\r",向进程发送uname命令,要注意后面的"\r"表示回车的意思。
expect:
命令格式:expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]
举例:
expect {
"a" {send "hello a\r"}
"b" {send "exit\r"}
-re "c|d" {send "use regex\r"}
}
expect通常用于等待进程返回字符串。 如:expect "hi\r"表示进程返回了hi的字符串,加上-re表示正则匹配。此外expect支持多分支模式,类似switch-case的方式。
interact:
表示允许用户交互,进程停留在命令行状态下,等待用户进行操作。
注意:通常expect脚本是以expect eof或interact结束。前者表示自动化任务结束。
set:
主要用来设置环境变量。如set timeout 30表示等待30秒结束。
命令参数:$argv
expect脚本可以接受命令行传过来的参数 。如:expect my.exp 1 2 3,可以通过 [lindex $argv n],获得相应的参数(n=0,1,2.....)。