自動互動式指令碼 expect簡介

2021-07-10 20:00:40 字數 2034 閱讀 1260

我們經常會遇到一些需要與伺服器程式打交道的場景,比如,從登陸某個伺服器,然後進行某項工作。這很平常,但是如果把這個工作自動化進行,你就需要乙個程式能自動做你要告訴機器的事情,這樣,我們的expect就能大顯身手了。

首先,expect是乙個簡單的工具語言,如要工作就是進行自動化的人機互動。它的作者對expect的定義:是乙個實現自動互動功能的軟體套件(a software suite for automating interactive tools),使用expect,它能幫助我們在合適的情景下進行合適的互動。

我們看乙個簡單的例子:我們要在凌晨登陸到乙個linux伺服器:192.168.1.1,然後執行乙個命令做/home/test/a.sh,我們的思路是:寫乙個expect指令碼,然後用crontab在凌晨執行。

那麼讓我們看看最簡單也很好用的登陸的expect指令碼是怎樣的:

1.#!/usr/bin/expect -f

set timeout 30

spawn ssh -l test 192.168.1.1

expect "password:"

send "mypassword\r"

expect "~$*"

send "/home/test/a.sh\r"

send "exit\n"

expect eof

exit

現在來解釋一下:

expect 的核心功能,對於設定好的特定匹配形式,以相匹配的動作以應對。每乙個expect後所跟的字串(或者正規表示式)就是指令碼所等待的匹配模式,每乙個send 所做的工作就是對於各種的模式串,實施相應的動作。

第一行設定了指令碼執行的程式,-f選項指的是expect執行乙個檔案

第二行,設定了本指令碼所有的超時時間,單位是秒(s),如果超時,指令碼將繼續向下進行(比如在等待某個模式出現,超時以後,會進行下一語句)。

第三行,expect使用spawn命令來啟動指令碼和命令會話,這裡啟動的是ssh命令,這裡的ssh命令將會以子程序的方式產生。

下面就是互動的過程:ssh -l 登陸以後,會給要求客戶寫入密碼,所以等待出現「password:」,出現password:以後,需要寫入密碼,注意這裡需要送去回車或者換行符,否則遠端主機不會收到ssh請求的。登陸上系統之後,會出現命令提示符:~$,即系統已經登陸到了遠端主機的shell,然後送去要執行的命令。完畢後推出遠端機器(這個send "exit\r"前也可以有上乙個命令的輸出,也可以沒有,因為上乙個命令執行完畢後會順序執行下一條)。

最後是等待標示子程序已結束的標示符eof,然後退出。(注:這個等待eof必須要有,如果沒有eof,很可能在子程序沒有結束前就退出,造成問題。)

下面的例子,介紹expect其他重要的命令,先看如下例子:

#!/usr/bin/expect -f

set timeout 10

set myname [lindex $argv 0]

spawn ./talk.sh

expect "name:"

send "$myname\r"

expect eof 1.

這個例子引入了輸入引數的概念,就是在執行這個expect指令碼時候,需要帶入引數,比如這個指令碼名字如果為test.ep

執行時需要鍵入引數:./test.ep "john"

set myname [lindex $argv 0] 這句獲取外部傳入的第乙個引數(argv 0)並傳給變數myname,如果獲取多個引數則使用argv 1,argv 2,以此類推。

另外,expect支援一般語言所常用的if,for等流程控制語句,這個可以參看expect高階介紹

小結:expect是一款非常好用的自動化互動工具

核心命令:

spawn: 啟動乙個命令或程式,並由expect程式開始監聽

set :設定變數值和名稱

set .. lindex:從程式輸入引數出獲取變數值並賦給變數

expect ...send對:expect等待希望出現的匹配串,對於匹配到的串,send傳送命令進行執行。

本文介紹了最簡單的expect指令碼知識,但這也是日常工作中用最多的一類expect指令碼,希望對各位讀者有所幫助。

互動式命令 expect

shell儘管很強大。但是貌似無法完成互動式命令的操作,例項 ssh host 如果host而且該機沒有加入信任。手動輸入的時間需要password。這樣的情況下可以使用expect支援。下面舉個樣例來說明expect的功能與使用 功能 對集群各機器執行同樣指令 如 集群ip 為 192.168.6...

Expect自動化互動式程式

expect是乙個用來實現自動互動功能的軟體套件,是基於tcl的指令碼程式設計工具語言 首先 要安裝expect 直接使用yum安裝即可 yum install expect y每次我們進行ssh連線時都需要輸入密碼 而且首次需要輸入yes來確認 root alice ssh p 22 jenny ...

expect 自動互動指令碼

命令列引數 ar 引數陣列,使用 lindex ar n 獲取,ar 0為指令碼名字 argc,引數個數 set username lindex ar 1 獲取第1個引數 set passwd lindex ar 2 獲取第2個引數 set timeout 30 設定超時 spawn是expect內...