expect 是什麼?
expect 是 tcl 和 tk 語言的擴充套件。expect 為使互動式程式的指令碼編制自動化,提供了簡單而功效強大的介面。另外,expect 使互動式應用程式嵌入 gui 變得容易。expect 的開發與 tcl/tk 的出現是同時發生的,兩者目前的版本都是 5.32。
expect 的作者是 don libes,他在美國國家標準與技術學會(nist)工作。expect 主頁駐留在 nist 伺服器上。(然而,expect 和任何相關的商業或非商業產品顯然都未經 nist 認可。)在下面幾屏中,將研究從源**示例目錄中精選出來的一些 expect 指令碼示例,並簡要概述它的命令語法。
為什麼要學習 expect?引用 don **中的一句話,「使用 expect,使系統管理任務自動化」(usenix lisa 會議 1990 年 10 月)「……結果是 unix 系統管理員的工具箱裡充斥著曾經見到過的一些最差的使用者介面。只有完全重新設計才能幫助解決所有這些問題,expect可用來處理許多這些問題。」
使用 expect 的 rfc 檢索
#!/usr/local/bin/expect --
# ftp-rfc # ftp-rfc -index
# retrieves an rfc (or the index) from uunet
exp_version -exit 5.0
if
set file "rfc$argv.z"
set timeout 60
spawn ftp ftp.uu.net
expect "name*:"
send "anonymous\r"
expect "password:"
send "[email protected]\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "cd inet/rfc\r"
expect "550*ftp>" exit "250*ftp>"
send "get $file\r"
expect "550*ftp>" exit "200*226*ftp>"
close
wait
send_user "\nuncompressing file - wait...\n"
exec uncompress $file
在介紹 expect 之前,請先研究左邊的示例。它只是對在標準 expect 源**分發版的示例目錄中的版本略加修改而得到的,所有示例都在這個目錄下。讓我們看一下**……
這個程式使 uunet 檔案檔案中 ietf rfc(request for comment)文件的 ftp 檢索自動化。指令碼的第一行呼叫 expect 外殼。注意,我已經給出了可執行檔案的完整路徑名。這是最安全的,因為很難知道任何給定使用者的路徑環境。該指令碼先檢查 expect 版本,然後列印用法訊息,除非給出正確的自變數數目。
接下來,設定 timeout 值,在下一行產生的 ftp 會話無法正確連線時,防止 expect 指令碼鎖住系統資源。指令碼的其餘部分大多數是幾組expect/send 命令對。每個 expect 命令等待來自產生程式(在本例中是 ftp)的指定輸出,後send 正確響應。注意,在 cd 和 get 指令之後有兩個 ftp 錯誤**的陷阱。對於每種情況,錯誤** 550 與第乙個條件匹配,如果為真,則指令碼存在。否則,執行 250 **(表示成功),expect 進入下一條命令。
expect 的關鍵,第 1 部分
#!../expect -f
# username is passed as 1st arg, passwd as 2nd
set password [lindex $argv 1]
spawn passwd [lindex $argv 0]
expect "password:"
send "$password\r"
expect "password:"
send "$password\r"
expect eof
expect(作為語言,『e』大寫)有四個關鍵命令。第乙個是 expect(命令,小寫『e』),如果找到匹配,它搜尋模式並執行命令。對於每條expect 命令,可以有幾個組,每個組都是由選項標誌、與之匹配的模式以及要執行的命令或命令主體組成。預設情況下,expect「偵聽」sdtout 和 stderr,直到找到匹配或timeout 期滿為止。
預設情況下,使用 tcl 的字串匹配設施來匹配模式,它實現檔名替換,類似於 c 外殼模式匹配。-re
標誌呼叫 regexp 匹配,-ex
表明必須是精確匹配,不帶萬用字元或變數擴充套件。expect 的其它可選標誌包括-i
和-nocase
,前者表示要監控產生的程序,後者強迫在匹配之前將程序輸出變為小寫。對於完整的說明,在命令提示符下輸入man expect
,以檢視 expect 的系統手冊頁面文件。
第二個重要命令是 send,它用於為由 expect 指令碼正在監控的程序生成輸入。send 合併選項以傳送給指定的產生的過程(-i
),緩慢地傳送(-s
,例如,在序列通訊中,為了不使緩衝區溢位)以及其它幾個選項。
expect 的關鍵,第 2 部分
#!/usr/local/bin/expect
# script to enforce a 10 minute break
# every half hour from typing -
# written for someone (uwe hollerbach)
# with carpal tunnel syndrome.
# if you type for more than 20 minutes
# straight, the script rings the bell
# after every character until you take
# a 10 minute break.
# author: don libes, nist
# date: feb 26, '95
spawn $env(shell)
# set start and stop times
set start [clock seconds]
set stop [clock seconds]
# typing and break, in seconds
set typing 1200
set notyping 600
interact -nobuffer -re . elseif
set stop [clock seconds]
}
左邊是稱為carpal
的指令碼,它也是來自源** expect 分發版的另乙個示例。
spawn 是用於建立新程序的 expect 命令。它已經出現在我們使用過的每個示例中。在左邊,它把路徑拖到預設外殼可執行檔案並產生新例項。在這樣做時,spawn 返回乙個程序標識(在變數spawn_id
中設定)。這可以在指令碼中儲存並設定,這給予了 expect 程序控制能力。
interact 是 expect 用來開啟使用者與產生程序之間通訊的命令。-nobuffer
標誌將與模式匹配的字元直接傳送給使用者。-re
告訴interact 將接下來的模式用作標準正規表示式,『.』是與輸入時每個字元匹配的模式。在互動方式中,預設情況下,expect 的 stdout 和 stderr 流的重定向也返回給使用者。
使用 expect 可以完成哪些任務?
當指令碼呼叫互動式程式時,預設情況下,expect 攔截所有輸入和輸出(stdin、stdout 和stderr)。這允許 expect 搜尋與程式輸出匹配的模式,並將輸入傳送到產生的程序,以模擬使用者互動。另外,expect 可以將程序的控制傳遞給使用者(如果這樣指示的話),或者根據請求控制。
這些特性不僅使 expect 對於公共管理任務變得非常有用,而且證實了 expect 有益於構建測試指令碼,以在程式開發期間執行 i/o 驗證。
最後,有乙個極其有用的程式autoexpect
。它本身是乙個 expect 指令碼,autoexpect
監控命令列互動式程式,生成精確複製該互動的 expect 指令碼。現在,雖然通常不需要它,但很容易拿幾個 autoexpect 會話的結果,概括 expect 模式,然後將它們剪貼到期望的配置中。已經在多處提到過,學習 expect 的最佳工具是執行 autoexpect 並使用這些結果。
expect 的小點 expect的使用
expect password send 123456 r 注意 expect 和字串 password 中間有乙個空格,send和字串 123456 r 中間有乙個空格。因為expect和send都是乙個命令,只有加空格才能與引數分開。expect 注意 expect與 之間有乙個空格,因為這樣e...
expect程式設計
expect是unix系統中用來進行自動化控制和測試的軟體工具,由don libes製作,作為tcl指令碼語言的乙個擴充套件,應用在互動式軟體中如telnet,ftp,passwd,fsck,rlogin,tip,ssh等等。該工具利用unix偽終端包裝其子程序,允許任意程式通過終端接入進行自動化控...
expect 程式設計
一 expect介紹expect 是乙個免費的程式設計工具,用來實現自動的互動式任務,而無需人為干預。說白了,expect 就是一套用來實現自動互動功能的軟體。需要安裝 yum install y expect 二 expect基礎 在使用 expect 時,基本上都是和以下四個命令打交道 命令 作...