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
     
  • 相关阅读:
    记: Spring Data Jpa @OneToMany 级联查询被动触发的问题
    后端小白的Bootstrap笔记
    最短路径问题
    深度优先搜索 & 广度优先搜索
    检讨书板子
    关于计时器
    博客园美化
    P4819 杀人游戏 (图论 )
    水站 (二分)
    对拍
  • 原文地址:https://www.cnblogs.com/SunHuaJ/p/9098172.html
Copyright © 2011-2022 走看看