shell进阶——expect免交互工具的使用

Posted xiaoyuxixi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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秒;

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,我们完全可以通过脚本来进行实现,如果足够熟悉脚本而且工作需要的话,我们甚至可以实现单个脚本来完成搭建,测试,排错等等一系列解放双手的功能。

以上是关于shell进阶——expect免交互工具的使用的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本----(sorttruniq工具和免交互expect)

Shell脚本之Expect免交互

Shell编程之Expect免交互

Shell编程——Expect免交互

无标题文章shell编程之Expect免交互

Shell编程之Expect免交互语句详解