Expect是Linux操做系统下的一个用来处理交互操做,系统默认是没有安装expect库,因此执行expect会提示找不到命令,须要手动安装,其它安装也比较简单,能够经过二进制源码包编译配置进行安装,也能够经过网络借助yum源来安装,yum源安装比较简单;咱们下面借助Expect库来实现Linux交互式自动化运维操做,只须要执行脚本就能够实现自动化运维操做,不须要手动输入一些信息按肯定,咱们能够将交互过程写在一个脚本上,使之自动化完成。咱们能够经过expect实现ssh自动登陆、ftp自动登陆、自动传输文件、自动建立和删除用户等都符合交互式自动化运维。下面咱们会经过一些案例来展示结果,咱们经过如下几个命令来介绍四个基础命令。linux
Linux在企业中应用仍是比较普遍,并且expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通讯,而无需人的干预。expect是不断的更新,随着时间的流逝,其功能愈来愈强大,对Linux有基本的了解都知道这个命令,并且是Linux操做系统管理员必不可少的一个命令,经常使用的shell脚本都须要用到这个工具,能够省去运维大量的操做时间,有利于提升工做效率,若是对Linux不太了解的能够去购物平台去搜刘遄老师的《Linux就该这么学》这本书学习,书籍内容比较适合初学者,也有好多案例比较适合企业经常使用的一些操做,expect须要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。正则表达式
咱们经过yum源来简单的介绍下expect须要安装哪几个库,若是要经过二进制tar.gz包安装也能够,须要去下载expect.tar.gz安装包,这里就不介绍了,操做以下:shell
# yum install expect.x86_64 expect-devel.x86_64 -y编程
下面详细的解释四个基础命定,expect中最关键的四个命令是:send,expect,spawn,interact。vim
一、send:用于向进程发送字符串;服务器
二、expect:从进程接收字符串;网络
三、spawn:启动新的进程;运维
四、interact:容许用户交互;ssh
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 "}
3. 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就使用来实现这种功能的工具,但愿本文章会给你们有所帮助。