zoukankan      html  css  js  c++  java
  • shell中的交互模式:expect

       在shell开发中,我们连接FTP或者passwd或sudo等操作时,需要手动输入密码。对于自动化而言,这显然是不合适的。而expect的强交互模式解决了这个问题。工作中偶有涉及到这个,个人也是简单的了解,解决实际问题,作学习记录。

    一:安装【参考地址:https://www.cnblogs.com/lixigang/articles/4849527.html

      expect需要Tcl编程语言的支持,所以expect需要安装两个东西。一个tcl,一个expect;[安装前,可通过 "which/whereis expect"判断服务器是否已安装]

       1、tcl下载与安装

        解压: 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
    ";exp_continue }
     7   "Password" { send "$passwd
    ";exp_continue }
     8   eof {;}
     9 }
    10 exec sleep 5
    11 expect {
    12     "#" send{"touch tt
    "}
    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 "
        使用exp_continue后,会重新从当前expect块的开始重新执行,可以简单理解问while循环的continue
     
    6、sleep
        由于自动执行受限于系统响应时间和send内指令的执行时间,设置sleep时间,单位:秒
     
    7、eof
        进程的结束在expect的最后有两种选择。一个是用eof匹配,在spawn进程结束后会向expect发送eof,结束进程。也可以使用interact,在执行完成后保持交互状态将控制权交给控制台;
     
    谢谢!
     
     
     
     原创博客,转载请注明出处!欢迎邮件沟通:shj8319@sina.com
     
  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/SunHuaJ/p/9098172.html
Copyright © 2011-2022 走看看