zoukankan      html  css  js  c++  java
  • Expect 在网络管理中发挥着重要作用

    原文链接

    废话 可忽略


     

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

     

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2548655.html
Copyright © 2011-2022 走看看