Shell 互動工具 Expect 解釋及示例
阿新 • • 發佈:2019-01-01
一、概述
我們通過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
命令主要用於退出自動化,進入人工互動。比如我們使用spawn
、send
和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
便可以自動化的執行互動式命令了