zoukankan      html  css  js  c++  java
  • shell进阶——expect免交互工具的使用

    前言:

      expect是什么?

    答:expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。

      expect能做什么?

    答:借助expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率,使用它,你甚至可以仅仅执行一个脚本来完成分布式应用系统的搭建与维护。

      以上两个问题的答案或许还不能详尽的解释expect的作用,但可以肯定的是,它将会为你带来方便,让你更轻松的完成你的工作。

    一、环境安装:

      expect并非是shell能够解释的,所以,想要执行它来完成你的脚本,你需要先安装两个软件包,当然,在使用yum的情况下,我们执行这条命令就可以了:

    yum install expect -y

    二、expect介绍:

    在使用expect时,基本上都是和以下四个命令打交道:

    命令       作用
    send      用于向进程发送字符串
    expect   从进程接收字符串
    spawn   启动新的进程
    interact   允许用户交互

    详细介绍:

    send命令接收一个字符串参数,并将该参数发送到进程。
    expect命令和send命令相反,expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令。
    spawn命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互。
    interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

    应用举例1:

    #!/usr/tcl/bin/expect:
    #使用expect来解释该脚本;
    
    set timeout 30:
    #设置spawn执行后等候回应的超时时间,单位为秒,默认情况下是10秒;可以设置为-1,表示无限制。
    
    set host "192.168.92.100":
    #设置变量;
    set username "root"
    #设置用户名; set password "123456"
    #设置密码;
    spawn ssh $username@$host:spawn #是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。它主要的功能是给ssh运行进程加个壳,用来传递交互指令; "yes/no" { send "yes
    "; exp_continue; } #选择是否信任该IP expect "*password*": #这里的expect也是expect的一个内部命令,这个命令的意思是判断上次输出结果里是否包含“password”的字符串,如果有则立即返回;否则就等待一段时间后返回,这里等待时长就是前面设置的30秒; send "$password
    ": #当匹配到对应的输出结果时,就发送密码到打开的ssh进程,执行交互动作; interact: #执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上,这个功能是我们在需要完成人工干预的情况下所做的选择。

    应用举例2(在shell脚本中应用expect并执行命令):

    #!/bin/bash
    /usr/bin/expect << EOF
    #在shell中调用expect
    spawn ssh root@192.168.92.129
    expect {
    "yes/no" { send "yes
    "; exp_continue; }
    "password" { send "123
    " }
    }
    expect "]*"
    #root用户为]#,普通用户为]$,我们选择*来模糊匹配
    send "cd / && ls
    "
    expect "]*"
    send "exit
    "
    EOF

    执行结果:

     可以看到,执行是没有问题的,我们成功的远程执行了linux命令(当然,也可以实现不同的用户在同一台机器上执行命令)。

    总结:

      能够在工作中熟练的使用Shell脚本可以很大程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自动化进行,很多的应用场景都可以应用到expect的功能,如oracle的安装,weblogic的静默安装等等,如果掌握了expect,我们完全可以通过脚本来进行实现,如果足够熟悉脚本而且工作需要的话,我们甚至可以实现单个脚本来完成搭建,测试,排错等等一系列解放双手的功能。

  • 相关阅读:
    CodeForces
    Educational Codeforces Round 111 (Rated for Div. 2)
    「JOISC 2020 Day4」治疗计划
    [杂题合集] 其真无码耶?
    [2021.7.16] 洛谷七月月赛
    倾心力作!嵌入式linux开发指南(RK3399),3399教程1500+,开发资料全覆盖
    资料丨迅为IMX6ULL开发板-主频和时钟配置例程(二)
    资料丨迅为IMX6ULL开发板-主频和时钟配置例程
    自学嵌入式拉低偏差丨4412开发板学习指引+为学习后面内容打下基础
    文档资源有话说丨再次升级-i.MX6Q开发板手册更新
  • 原文地址:https://www.cnblogs.com/xiaoyuxixi/p/12084377.html
Copyright © 2011-2022 走看看