在shell开发中,我们连接FTP或者passwd或sudo等操作时,需要手动输入密码。对于自动化而言,这显然是不合适的。而expect的强交互模式解决了这个问题。工作中偶有涉及到这个,个人也是简单的了解,解决实际问题,作学习记录。
一:安装【参考地址:https://www.cnblogs.com/lixigang/articles/4849527.html】
expect需要Tcl编程语言的支持,所以expect需要安装两个东西。一个tcl,一个expect;[安装前,可通过 "which/whereis expect"判断服务器是否已安装]
1、tcl下载与安装
下载: wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
解压: tar -xzvf tcl8.4.11-src.tar.gz 【-C 目标地址]
配置:cd tcl8.4.11/unix && ./configure --prefix=/usr/tcl --enable-shared && make &&make install
拷贝:安装完毕以后,将目录unix下面的tclUnixPort.h copy到tcl8.4.11 目录下的generic目录中
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,在执行完成后保持交互状态将控制权交给控制台;
谢谢!
原创博客,转载请注明出处!欢迎邮件沟通:[email protected]
原文地址:https://www.cnblogs.com/SunHuaJ/p/9098172.html