废话 可忽略
接触Expect是迫不得已。系统管理员在工作中经常会遇到这样的问题,需要实现一个自动交互的工具,这个工具可以自动Telnet或者Ftp到指定的服务器上,成功login之后自动执行一些命令来完成所需的工作。
当然,有很多编程语言可以去解决此类问题,比如用C、Perl、或者Expect。
显然,尽管C是无所不能的,但是解决此类问题还是比较困难,除非你熟悉Telnet或者Ftp协议。
曾经见过别人用C实现了一个简单的Telnet客户端协议的程序,可以在这个程序加入自己的代码来捕获服务端的输出,根据这些输出来发送适当的指令来进行远程控制。
使用Perl一样可以实现这样的功能,然而,Expect做的更出色,而且除支持Unix/Linux平台外,它还支持Windows平台,它就是为系统管理和软件测试方面的自动交互类需求而产生的
介绍Expect的时候,不得不说到TCL,毕竟这个语言是用TCL写的,于是,其中除了部分的自有命令外,语法也都是TCL的语法,所以在Expect教程里面,将会重点通过一些程序来介绍Expect的功能。
先看一个最简单的Expect程序
#!/usr/bin/expect
set timeout 10
spawn telnet 10.80.1.23
expect "login:"
send "user\r"
expect "Password:"
send "123456\r"
expect "%"
puts “Telnet connection established”
对于Expect程序,是可以以tcl后缀名结尾的,上一个程序的名字为testTelnet.tcl,且执行方法和tcl也一致,直接./testTelnet.tcl即可,但是注意文件的第一行,在TCL程序中,第一行的内容为
#!/usr/bin/tclsh
而在这里变为了
#!/usr/bin/expect
这个程序的作用如下,
1. 建立一个到10.80.1.23的telnet连接,由spawn telnet 10.32.17.10来完成,
2. 等待屏幕打印login,由expect “login:”来实现
3. 然后发送用户名user,由send “user\r”来完成,其中\r表示在输入user后按下回车键
4. 等待屏幕打印Password:,由expect “Password”来实现
5. 发送密码123456,同第3步
6. 等待登录成功的提示符%
7. 输出登录成功消息
这是自动通过telnet登录的程序,基本上程序中的每句话都被解释过了,唯一剩下的就是set timeout 10是什么意思呢?
我们可以看到,上面expect都是用来等待某个结果出来的,如果这个结果一直不出来怎么办?难道程序一直等下去么?当然不是,所以这里就有了timeout,也就是程序如果在等待10s种后没有得到期望结果,将会自动退出。如果不设置timeout的话,expect默认的时间是20s。
而至于spawn,send,expect,这些都是内置的expect命令,其中spawn专门用来建立网络连接的时候用的,记住就可以了。
在这里,需要提示的是在使用expect命令等待内容的时候,后面的内容一定要是屏幕输出的最后内容。比如上述程序中等到了“login”,“%”等,都是屏幕输出的最后,至于为什么,将在以后描述。