Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装,也可以通过网络借助yum源来安装,yum源安装比较简单;我们下面借助Expect库来实现Linux交互式自动化运维操作,只需要执行脚本就可以实现自动化运维操作,不需要手动输入一些信息按确定,我们可以将交互过程写在一个脚本上,使之自动化完成。我们可以通过expect实现ssh自动登录、ftp自动登录、自动传输文件、自动创建和删除用户等都符合交互式自动化运维。下面我们会通过一些案例来展现结果,我们通过以下几个命令来介绍四个基础命令。

Linux在企业中应用还是比较广泛,而且expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断的更新,随着时间的流逝,其功能越来越强大,对Linux有基本的了解都知道这个命令,而且是Linux操作系统管理员必不可少的一个命令,常用的shell脚本都需要用到这个工具,可以省去运维大量的操作时间,有利于提高工作效率,如果对Linux不太了解的可以去购物平台去搜刘遄老师的《Linux就该这么学》这本书学习,书籍内容比较适合初学者,也有好多案例比较适合企业常用的一些操作,expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。
我们通过yum源来简单的介绍下expect需要安装哪几个库,如果要通过二进制tar.gz包安装也可以,需要去下载expect.tar.gz安装包,这里就不介绍了,操作如下:

yum install expect.x86_64 expect-devel.x86_64 -y

下面详细的解释四个基础命定,expect中最关键的四个命令是:send,expect,spawn,interact。
1、send:用于向进程发送字符串;
2、expect:从进程接收字符串;
3、spawn:启动新的进程;
4、interact:允许用户交互;

  1. send命令
    send命令接收一个字符串的参数,并且将该参数发送到进程。
    [root@zbox ~]# expect
    expect1.1> send "hello world\n"
    hello world
    expect1.2>

  2. expect命令
    expect命令和send命令执行的结果正好相反,expect是用来等待一个进程的反馈消息,expect可以接收一个字符串参数,也可以接收正则表达式参数,一般都是与send命令结合使用才能看到明细的效果,下面我们可以用一个最简单的交互式的案例来展示效果:
    expect "hi\n"
    send "hello there!\n"
    上面两行代码的意思是:从标准输入中等到hi和换行键后,向标准输出输出hello there。

Expect还有一种最常用的语法是来自tcl语言的模式-动作,这种语法在shell中应用极其灵活,使用也非常方便,下面我们就各种语法用案例来说明
expect "hello" {send " hello "}

  1. spawn命令
    上面的所有案例都是和标准输入输出进行交互,但是我们更希望他可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的。结合上面的send和expect命令我们可以实现一个更复杂点的shell程序。

    vim test.sh

    set timeout -1 //设置永不超时;
    spawn ssh -p 22 root@192.168.3.9 //开启新的进程ID,该进程的用户连接远程ssh服务器;
    expect "*Password" //进程返回Password时;
    send "password\r" //向进程输入password\r,这里是输入是root用户的密码

下面是测试脚本的结果:

这段代码的作用是实现登录到ssh服务器192.168.3.9的root账号上,这段shell代码中用到interact,下面我们就来详细的介绍这个命定;

4.interact
到现在为止,我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是,如何让人在适当的时候干预这个过程了。比如ssh登录到服务器上面要执行什么操作,仍然可以停留在ssh服务器登录状态,以便手动的执行后续命令。interact可以达到这些目的。下面的案例是在自动登录ssh服务器后,允许用户交互操作。
#!/usr/bin/expect
spawn ssh root@192.168.3.9
expect "*password:"
send "password\r"
spawn sleep 10
interact
exit
这个案例其实和上面这个差不多,但是这个多了一个自动退出功能,设置登录成功10s后自动退出。

Expect在shell中也是一个比较复杂的库,如果想深入的了解,自己也要多结合理论和实践操作一起进行,这样学习起来还是比较快的,还可以通过shell实现简单的控制功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如ssh服务器等进行交互的功能,而expect就使用来实现这种功能的工具,希望本文章会给大家有所帮助。

Linux Shell交互式自动化运维程序的更多相关文章

  1. Python Linux系统管理与自动化运维

    Python Linux系统管理与自动化运维 前言 第1章Python语言与Linux系统管理1 1.1Python语言有多流行1 1.2Python语言为什么流行3 1.3Python语言有什么缺点 ...

  2. 基于Linux平台的自动化运维Devops-----之自动化系统部署

    一.自动化运维的背景网站业务上线,需要运维人员在短时间内完成几百台服务器部署,包括系统安装.系统初始化.软件的安装与配置.性能的监控......所谓运维自动化,即在最少的人工干预下,利用脚本与第三方工 ...

  3. 自动化运维工具fabric使用教程

    摘要:当需要同时管理许多服务器时,如果我们一台一台登陆上去操作会显得费时又费力.此时我们可以用fabric这个包提供的API来编写python脚本完成服务器集群的统一管理. 核心原理:fabric为主 ...

  4. Linux云自动化运维第四课

    Linux云自动化运维第四课 一.vim 1.vim光标移动 1)在命令模式下 :数字  ###移动到指定的行 G  ###文件最后一行 gg  ###文件第一行 2)在插入模式下 i  ###光标所 ...

  5. Linux云自动化运维第五课

    Linux云自动化运维第五课 一.进程定义 进程就是cpu未完成的工作 二.ps命令 ps a ###关于当前环境的所有进程 x ###与当前环境无关的所有进程 f ###显示进程从属关系 e ### ...

  6. 自动化运维:(1)认识 Shell

    目录 (一)运维是什么? (二)什么是 Shell? (三)Shell的分类 (四)Shell脚本 (五)Shell的变量 (六)表达式 (七)Linux常见符号 (八)常见命令 (一)自动化运维是什 ...

  7. Linux实战教学笔记25:自动化运维工具之ansible (一)

    第二十五节 ansible之文件的批量分发 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转 ...

  8. linux自动化运维工具Ansible saltstack Puppet、Chef、Fabric之间的对比

    发现分布式是一个发展的趋势,无论是大型网站的负载均衡架构还是大数据框架部署,以及云存储计算系统搭建都离不开多台服务器的连续部署和环境搭建. 当我们的基础架构是分散式或者基于云的,并且我们经常需要处理在 ...

  9. Linux轻量级自动化运维工具— Ansible

    Ansible 是什么 ? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配 ...

随机推荐

  1. python3使用ltp语言云

    text="我爱自然语言处理." text=str(text) #text=urllib.quote(text) text=urllib.parse.quote(text) def ...

  2. lnmp宝塔面板问题

    使用宝塔面板后,无法安装zabbix客户端的依赖包,总是提示mariadb冲突,其实mariadb早就卸载完了,所以要安装zabbix客户端就不好使用宝塔面板

  3. 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()

    7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...

  4. Day02:对象和类(下)

    构造方法 什么是构造方法 在类实例化对象时运行的一种特殊的方法 为什么需要构造方法 构造方法适合为对象的属性赋初值 编写构造方法 public 类名(){ //方法体 } 构造方法不写返回值 构造方法 ...

  5. 利用Python如何实现数据驱动的接口自动化测试

    前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取.下面话不多说了,来一起看看详细的介绍吧. 1.需求 某API,GET方法,token,m ...

  6. Unity 声音与录音与麦克风实时播放

    Unity AudioSource与MicroPhone以及AudioClip之间的关系. 下面是一个声音,长度为7秒钟,声音的实际数据本质是由采样点组成的的列表,一秒钟内的采样点数就是采样频率,下面 ...

  7. [开发技巧]·pandas如何保存numpy元素

    [开发技巧]·pandas如何保存numpy元素 ​ 1.问题描述 在开发的过程中遇到一个问题,就是需要把numpy作为pandas的一个元素进行保存,注意不是作为一列元素.但是实践的过程中却不顺利, ...

  8. 匿名函数、委托和Lambda表达式

    匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...

  9. IDEA 对spring boot Maven 项目打 Jar 包

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...

  10. vue--过滤器(私有,全局)

    过滤器 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的 ...