2、expect下载与安装
下载:wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
解压:tar -xzvf expect5.45.tar.gz
配置:cd expect5.45 [切换到解压路径下]
安装: ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic && make && make install
3、创建软链
ln -s /usr/expect/bin/expect /usr/bin/expect [指向引用,这时可以检查一下自己的Linux是否已安装expect。有的话就安装正确了。]
二:命令介绍
我们通过对一个简单脚本的分析,来看看expect是如何实现的。
1 #!/usr/bin/expect
2 set timeout 5
3 set passwd {9m[S)UWe4r}
4 spawn su root
5 expect {
6 "password" { send "$passwd\r";exp_continue }
7 "Password" { send "$passwd\r";exp_continue }
8 eof {;}
9 }
10 exec sleep 5
11 expect {
12 "#" send{"touch tt\r"}
13 eof {;}
14 }
15 expect eof
1、#!/usr/bin/expect
如果通过sh命令方式调用,则忽略该语句,实际脚本仍以bash脚本语言来执行,应用expect命令调用该文件;如将expect文件赋予可执行权限,输入对应路径加文件名(或./文件名),即可实现expect脚本语言方式处理【如果处理过程中,还希望用到bash,可通过在bash脚本中添加/bin/bash方式,调用bash shell。】
2、set timeout 10
设置超时时间,单位:秒
3、设置变量passwd
通过set方式,不需要添加“=”,也可以通过$args传递参数,使用[lindex $args n]调用参数,其中n从0开始, 分别表示第一个,第二个,第三个....参数。如我们将传递的第一个参数赋值给脚本内部变量:set my_var "[lindex $args 0]"
4、spawn su root
启动一个进程,并给这个进程加上一个外壳,可用来传递交互信息。
5、expect ...
是expect的一个内部命令,等待进程发送的某些字符串(如"password");类型于switch/case,能同时等待多个字符串,并对每一个字符串执行不同的操作。本例中使用了大括号(必须两个),也可以直接后接字符串如:expect “Password” ;send "$passwd\r"
使用exp_continue后,会重新从当前expect块的开始重新执行,可以简单理解问while循环的continue
6、sleep
由于自动执行受限于系统响应时间和send内指令的执行时间,设置sleep时间,单位:秒
7、eof
进程的结束在expect的最后有两种选择。一个是用eof匹配,在spawn进程结束后会向expect发送eof,结束进程。也可以使用interact,在执行完成后保持交互状态将控制权交给控制台;
谢谢!
原创博客,转载请注明出处!欢迎邮件沟通:shj8319@sina.com