1.expect语法:
expect 是基于tcl 演变而来的,所以很多语法和tcl 类似,基本的语法如下所示:
1.1 首行加上/usr/bin/expect
1.2 spawn: 后面加上需要执行的shell 命令,比如说spawn sudo touch testfile
1.3 expect: 只有spawn 执行的命令结果才会被expect 捕捉到,因为spawn 会启
动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提
示信息,eof 和timeout。
1.4 send 和send_user:send 会将expect 脚本中需要的信息发送给spawn 启动
的那个进程,而send_user 只是回显用户发出的信息,类似于shell 中的echo 而
已。
2.例子
下面是一个shell 中嵌入expect建立反向代理的例子
调用方法:/usr/local/src/autossh.sh 7293 20001 5977 test password test.xxx.cn
#!/bin/bash
expect <<HERE
set timeout 60
spawn autossh -M $1 -NR "*:$2:*:$3" $4@$6
expect {
"yes/no*" {
send "yes\n"; exp_continue
}
"password:" {
send "$5\n"; exp_continue
}
eof {
exit
}
}
HERE
注意点:
1.默认情况下,expect 语法timeout 是10 秒,如果到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。
2.如果连续做两个expect,那么实际上是串行执行的。
3.用{ }括起来 则是并行,expect 与“{ ”之间直接必须有空格或则TAB间隔,否则会出麻烦。
4.使用exp_continue后,会重新从当前expect块的开始重新执行,可以简单理解问while循环的continue