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\r"} #你的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\r”}}
expect:从进程中接收信息, 如果匹配成功, 就执行expect后的动作
send:向进程发送字符串

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

说明:判断输出的信息有没有包含assword的字符串,如果有,则发送一个命令123456\r( \r是敲回车),并退出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\r"
    send_user "success\n"
    #回显示给用户的信息,类似与echo,打印信息到控制台上
     
    exp_continue
  }
  assword {send "123456\r"}
}
 
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

 

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

  1. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  2. Linux CAT与ECHO命令详解 <<EOF EOF

    Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: .一次显示整个文件. $ cat filename .从键盘 ...

  3. Linux计划任务Crontab实例详解教程

    说明:Crontab是Linux系统中在固定时间执行某一个程序的工具,类似于Windows系统中的任务计划程序 下面通过详细实例来说明在Linux系统中如何使用Crontab 操作系统:CentOS ...

  4. Linux下tomcat的安装详解

    Linux下tomcat的安装详解 来源: ChinaUnix博客 日期: 2007.01.21 22:59 (共有0条评论) 我要评论 一,安装前的准备:1,Linux版本:我的是企业版.(至于红帽 ...

  5. Linux文件系统的目录结构详解

    Linux文件系统的目录结构详解   一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...

  6. Linux CAT与ECHO命令详解

    Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: 1.一次显示整个文件. $ cat filename 2.从 ...

  7. linux route命令的使用详解 添加永久静态路由 tracert traceroute

    linux route命令的使用详解 添加永久静态路由  tracert  traceroute route -n    Linuxroute  print  Windows traceroute  ...

  8. 【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...

  9. 【转】postgresql 9.4 在linux环境的安装步骤详解

    本文章来为各位介绍一篇关于postgresql 9.4 在linux环境的安装步骤详解,希望文章能够对各位新手朋友带来帮助的哦. 环境说明系统:centos 6.4 64位软件:postgresql ...

随机推荐

  1. 热更新应用--热补丁Hotfix学习笔记

    一.热补丁简介 热补丁主要是用于将纯C#工程在不重做的情况下通过打补丁的形式改造成具备lua热更新功能工程,主要是让原来脚本中Start函数和Update函数等函数代码块重定向到lua代码. 二.第一 ...

  2. SpringCloud+Nacos实现服务配置中心(Hoxton版本)

    关于 Nacos Spring Cloud 的详细文档请参看:Nacos Config和Nacos Discovery. 通过 Nacos Server 和 spring-cloud-starter- ...

  3. [状压DP]车II

    车 I I 车II 车II 题目描述 有一个 n ∗ m n*m n∗m的棋盘 ( n . m ≤ 80 , n ∗ m ≤ 80 ) (n.m≤80,n*m≤80) (n.m≤80,n∗m≤80)要 ...

  4. 《进击吧!Blazor!》系列入门教程 第一章 8.部署

    <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...

  5. Bounding Volume Hierarchies 加速结构

    背景   光线与物体求交是光线追踪的主要时间瓶颈.   如果不进行优化,则对每条光线,我们都需要遍历场景中的全部物体并求交.而现在想建模一个小物体的表面,往往要几千甚至几万个三角形,一个商业级产品,屏 ...

  6. JavaWeb 补充(Filter&Listener)

    目录 Filter:过滤器 Listener:监听器 Filter:过滤器 1. 概念:     * 生活中的过滤器:净水器,空气净化器,土匪.     * web中的过滤器:当访问服务器的资源时,过 ...

  7. Java(299-314)【线程、同步】

    1.多线程的原理 2.多线程内存图解 开辟新的栈空间,多个线程之间互不影响 3.Thread类的常用方法 getName()返回该线程的名称 Thread类的子类 获取线程的名称:     1.使用T ...

  8. starctf_2019_babyshell

    starctf_2019_babyshell 有时shellcode受限,最好的方法一般就是勉强的凑出sys read系统调用来注入shellcode主体. 我们拿starctf_2019_babys ...

  9. xman_2019_format(非栈上格式化字符串仅一次利用的爆破)

    xman_2019_format(非栈上格式化字符串仅一次利用的爆破) 首先检查一下程序的保护机制 然后用IDA分析一下 存在后门 首先malloc了一片堆空间,读入数据 把刚刚读入的数据当作格式化字 ...

  10. H5小技巧之——巧用<a>标签锚链接(#锚点链接 #页面特定位置 #DOM定位 #hash路由中使用锚链接)

    #作者:矩阵鱼--代码中游泳的咸鱼 前端开发中,常遇到定位到页面某特定位置的需求,JavaScript提供的el.scrollIntoView() 和 el.scrollIntoViewIfNeede ...