Shell 交互工具 Expect 解释及示例

一、概述

 我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。

       expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。

使用expert 需要 安装Tcl 以及 expect,这个网上很多,不在详述,本文主要讲解用法

二、解决的问题

接触到expect是因为工作中遇到了这样的场景,需要在两个集群之间定时通过scp命令传输数据,但是由于ssh不是免密互通的,因此会产生交互输入密码的情况,如何实现全程自动化并且执行一些复杂的逻辑或命令呢? 这就用到了expect来解决问题。

三、语法特点

在使用expect时,基本上都是和以下四个命令打交道:

命令 作用
send 用于向进程发送字符串
expect 从进程接收字符串
spawn 启动新的进程
interact 允许用户交互
  • send 命令接收一个字符串参数,并将该参数发送到进程。
  • expect 命令和 send 命令相反,expect 通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令。
  • spawn 命令用来启动新的进程,spawn 后的send expect 命令都是和使用spawn 打开的进程进行交互。
  • interact 命令用的其实不是很多,一般情况下使用spawnsend expect 命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact 命令的,interact 命令主要用于退出自动化,进入人工交互。比如我们使用spawnsend expect 命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact 命令就可以很好的完成这个任务。

四、简单示例

上面对expect进行了总结,特别是对一些常用的命令进行了详细的说明。下面就通过一些常用的expect脚本来具体的说明如何使用expect来完成日常的一些工作。

新建 transfer.expect 脚本

   #! /home/hdp-skyeye/tcl/bin/expect
   set timeout -1
   set src [lindex $argv 0]
   set dist [lindex $argv 1]
   set passwd [lindex $argv 2]
   spawn scp $src $dist
   expect {
        "*assword:" { send "$passwd\r" }
   }
   expect "100%"
   expect eof

后续只需这样执行命令

./transfer.expect example.gz [email protected]:/home/xudong/data  password

便可以自动化的执行交互式命令了

猜你喜欢

转载自blog.csdn.net/u012871914/article/details/85237692
今日推荐