Expect 在网络管理中发挥着重要作用【转载】

原文链接

 

http://www.cnblogs.com/wangkangluo1/archive/2012/06/13/2548655.html

废话 可忽略


 

接触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”,“%”等,都是屏幕输出的最后,至于为什么,将在以后描述。

posted @ 2012-06-17 12:37  Leo Forest  阅读(303)  评论(0编辑  收藏  举报