1. 程式人生 > >Shell 互動工具 Expect 解釋及示例

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 命令用的其實不是很多,一般情況下使用spawn
    send 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

便可以自動化的執行互動式命令了