• linux自动化交互脚本expect详解set timeout 5是 意思是在expect语句中,5s后超时,不再作出选择。


    linux自动化交互脚本expect详解

     更新时间:2020年10月21日 10:13:20   作者:lendsomething  
     
    这篇文章主要介绍了linux自动化交互脚本expect的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
     

     

    一、介绍

    expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务,无需人为干预。在实际开发中,运行shell脚本有时候会输入linux密码或者是mysql密码等,而expect可以帮我们输入。

     

    二、安装

    expect在linux系统中没有自带,需要我们自行安装,在Ubuntu系统下,安装命令如下

    1
    2
    sudo apt-get update
    sudo apt-get install expect

     

    三、简单的expect脚本

     

    3.1、编写脚本

    首先创建expect脚本

    1
    sudo vim hello.exp

    在hello.exp下写如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/expect
     
    set timeout 5
     
    spawn su
     
    expect {
      assword {send "123456 "} #你的linux密码
    }
     
    interact

    运行hello.exp

    1
    expect hello.exp

    运行后,你会发现你的用户就变成root用户了,我们用过linux的会知道,进入root用户是需要输入密码的,而使用了expect脚本,他就会自动帮我们输入密码。这就是expect的自动化交互。

    在这里插入图片描述

     

    3.2、解释脚本

    (1) #!/usr/bin/expect
    指定要运行的脚本,与shell脚本中的 #!/bin/bash 一样意思,若你不知道你的expect安装在哪里,可以使用 which expect来查看。我的就安装在 /usr/bin/expect下

    在这里插入图片描述

    (2) set timeout 5
    set:是设置变量,可以设置自定义变量,也可以设置expect脚本内部变量的值
    timeout:timeout是expect脚本的内部变量,我们自定义名称的使用不能使用这种内部变量名。timeout意思是超时时间,单位是秒,默认是10s超时,也可以设置-1,永不超时

    set timeout 5:意思是在expect语句中,5s后超时,不再作出选择。

    (3) spawn su
    开启一个新的进程来执行 su 命令

    (4) expect { assword send {“123465 ”}}
    expect:从进程中接收信息, 如果匹配成功, 就执行expect后的动作
    send:向进程发送字符串

    1
    2
    3
    expect {
        assword send {"123465 "}
    }

    说明:判断输出的信息有没有包含assword的字符串,如果有,则发送一个命令123456 ( 是敲回车),并退出expect语句;如果没有,则等待timeout的时间后退出expect语句。

    (5) interact
    执行完spawn内的命令后不退出,剩下的操作由我们人工来执行。如登陆ssh,expect脚本可以帮我们登录(不用手动输入密码),登陆之后需要我们手动交互。

     

    3.3、总结

    看到这里,相信你已经知道了expect脚本本质:提前知道了linux系统的返回信息,并捕获这些信息,来作出应答。

     

    四、正文

     

    4.1、常用命令说明

    命令说明
    set timeout n 设置expect语句超时时间为n秒。-1为永不超时
    set name value 设置变量名为name,其值为value
    set name [lindex $argv 0] 设置变量名为name,其值为 传入 expect脚本的第一个 参数 。第一个参数的索引值为0,第二个为1,依次类推
    spawn 启动新的进程,执行命令或者指定程序
    expect 接收进程中返回的信息, 如果匹配成功(有大小写区分), 就执行expect后的动作
    send 向进程发送字符串
    send_user 用来打印信息,相当于shell中的echo
    exp_continue 执行完expect后的动作后,使expect不退出,继续往下匹配
    expect eof 不允许用户交互,直接退出(这个用的会比interact多)
    interact 允许用户交互

     

    4.2、示例:运行shell脚本

    (1)创建一个shell脚本,1.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    echo "read print"
    read -p "please input name in there " NAME
    echo ${NAME}
     
    read -p "input password in there " PASSWORD
     
    echo ${PASSWORD}

    该脚本的意思就是输入你的账号,密码,并打印出来

    (2)创建一个expect脚本,1.exp。让1.exp帮我们输入信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/usr/bin/expect
     
    #若要运行shell脚本,写shell脚本的绝对路径
    spawn bash /home/hadoop/test/1.sh
     
    #设置expect语句的超时时间。默认10s
    set timeout 3
     
    expect {
      #expect类似于swtich语句,在括号{}内匹配语句,只要一找到匹配的语句,就会执行,
      #执行完之后就会退出,而加上exp_continue之后不会退出,会继续往下执行。
     
      #这里是匹配字符串,不需要双引号,有大小写区分
      name {
        send "meizhaowei "
        send_user "success "
        #回显示给用户的信息,类似与echo,打印信息到控制台上
         
        exp_continue
      }
      assword {send "123456 "}
    }
     
    expect eof #与interact相反,执行完程序不进入人工交互

    (3)运行

    在这里插入图片描述

    正常来说,运行1.sh会让你手动输入name与password,但是这里运行了1.exp后,就能让1.exp来帮你输入1.sh的信息

    若你想更深入的研究expect语法,这里有使用手册
    英语原版:http://www.tcl.tk/man/expect5.31/expect.1.html
    中文翻译:https://blog.csdn.net/cbuy888/article/details/80561461

     
  • 相关阅读:
    你不是在拯救世界就是在拯救世界的路上
    你可以去当程序员了
    郭美美是个好姑娘
    据说有个老太太
    生命的尽头
    有关程序的50个至理名言
    程序员是这样的
    新买移动硬盘
    如果有天你看到我疯了,其实就是你疯了
    写字楼里写字间
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/14287259.html
Copyright © 2020-2023  润新知