Expect 是 Unix 系統中用來進行自動化控制和測試的軟體工具，由製作，作為 Tcl 指令碼語言的一個擴充套件，應用在互動式軟體中如 telnet，ftp，Passwd，fsck，，，ssh 等等。該工具利用 Unix 偽終端包裝其子程序，允許任意程式透過終端接入進行自動化控制；也可利用 Tk 工具，將互動程式包裝在 X11 的圖形使用者介面中。 基本介紹 Expect 含有利用正則表示式進行模式匹配以及通用的程式設計功能，允許簡單的指令碼智慧地管理如下工具：telnetftp 和 ssh（這些工具都缺少程式設計的功能），宏以及其它程式。Expect 指令碼的出現使得這些老的軟體工具有了新的功能和更多的靈活性。 例子 一個簡單的指令碼程式例子就能實現自動的 telnet 會話： 假定 remote_server my_user_id my_password 和 my_command 已經讀入。 向遠端伺服器請求開啟一個 telnet 會話，並等待伺服器詢問使用者名稱 spawn telnet remote_server expect username 輸入使用者名稱，並等待伺服器詢問密碼 send my_user_idr expect password 輸入密碼，並等待鍵入需要執行的命令 send my_passwordr expect 輸入預先定好的密碼，等待執行結果 send my_commandr expect 將執行結果存入到變數中，顯示出來或者寫到磁碟中 set results expect_out buffer 退出 telnet 會話，等待伺服器的退出提示 EOF send exitr expect eof 另一個指令碼程式例子，自動建立 FTP 會話 向遠端伺服器請求開啟一個 FTP 會話，並等待伺服器詢問使用者名稱 spawn ftp remote_server expect username 輸入使用者名稱，並等待伺服器詢問密碼 send my_user_idr expect password 輸入密碼，並等待 FTP 提示符的出現 send my_passwordr expect ftp 切換到二進位制模式，並等待 FTP 提示符的出現 send binr expect ftp 關閉 ftp 的提示符 send promptr expect ftp 下載所有檔案 send mget r expect ftp 退出此次 ftp 會話，並等待伺服器的退出提示 EOF send byer expect eof 用法說明 Expect 是一種將現有的實用程式組合起來的膠合劑，通常考慮的是如何使 Expect 利用系統現有的工具解決問題而不是如何在 Expect 中解決問題。 Expect 主要應用涉及商用軟體產品。很多這類的產品都會提供某種命令列工具，但這些工具缺乏指令碼程式設計的能力，只是為了幫助使用者管理產品，而商家通常不會在如何實現一個穩定性好的指令碼語言上耗費很多精力。Expect 指令碼中可以包含 shell，查詢環境變數，透過執行某些 Unix 命令獲得更多的資訊，然後在產品所帶命令列介面中加入必須的資訊，來完成使用者的目標。在產品命令列介面中查詢相關資訊，該指令碼可以在多種選擇中智慧地決定當前應該做什麼比較合適。 每次 Expect 操作完成，執行結果將儲存在本地環境變數 expect_out 中。這允許指令碼收集這些資訊給使用者以相應的反饋，同時也允許根據當前情況傳送相對應的指令。 Expect 通常用來建立一組測試套件，可以用在程式、元件或者嵌入式系統中。就是利用 Expect 寫成的一組測試套件。它被大量地應用於測試 gcc，對於遠端目標的測試例如嵌入式開發也是非常合適的。 你可以利用一種叫作 autoexpect 的工具，自動生成 expect 指令碼。這個工具觀測你的操作，並利用啟發性知識生成 expect 指令碼。儘管生成的程式碼可能會很長，含義上有點模糊，你可以修改生成的指令碼使它成為你需要的程式碼。 觀點 利 Expect 可透過 cron 封裝系統管理任務，在規定的時期執行。能夠這樣做是因為 Expect 僅僅使用已經安裝在主機中的系統管理工具，不需要學習額外的工具。如果程式設計師學過 Tcl，那麼轉移到 Expect 是一件非常簡單的工作，相同的程式設計結構和語法，再加上一些內建的額外功能。 業界對室內管理任務使用 Expect 提供了很大的支援。Expect 在很多的公司廣泛使用，例如 Silicon Graphics IBM HP Sun Xerox Amdahl Tektronix ATT ComputerVision 和世界銀行，利用 Expect 對開發專案、檔案傳輸、帳號管理、網路測試進行室內自動測試。 Expect 已經以多種模組的方式移植到 Python 和 Perl 語言中。Expect 命令的部分子集移植到 Java 和嵌入到（基於 Java 的終端模擬器）之中。這些例行程式通常是原程式的同等功能的另一種解釋方式。一旦你理解了其中的概念，如果需要的話，換到其它語言，也就很容易了。 弊 Expect 繼承了 Tcl 的語法規範，對於使用其它指令碼語言的人來說這是相當陌生的。和其它語言如 bash、和 Perl 相比，Expect 的語法模式是不同的。就像有時候一個變數的字首冠以 ，有時候又不需要。有些版本的 Expect 和 Perl、Python 語言的語法倒是很相似的。 另一個缺陷是在不同的平臺移植 Expect 指令碼很難。例如，一個 Expect 指令碼使用基於 Unix 的工具，就不可能適合移植到 Windows 平臺。如果可能的話，程式設計師必須找到相應的命令列程式，能夠提供相同的資訊，這就可能需要修改 expect 指令碼的 send 部分，而這部分恰恰就是整個指令碼的核心。如果你使用的是 tclperl 或者 python 這些獨立於平臺的工具，使用它們各自的 POSIX 介面訪問檔案、對遠端互動進行標準的 POSIX 處理（telnetftp 等等），就不會出現上述問題。 一個不明顯的缺陷是，有時 Expect 可能並不是解決問題的最好方法。例如，一個系統管理員需要登入到多個伺服器，這些自動的操作要使用 Expect 就得配以儲存的密碼，而不是更安全的解決方案採用 ssh 代理金鑰。雖然這種自動互動工具很吸引人，但是還是有很多其它的辦法可以更安全穩定地解決同樣的問題。 Expect 自動化控制命令列工具，但是對圖形使用者介面就失效了。Windows 提供了不少有價值的工具，很多是基於圖形使用者介面的，這就是 Expect 失效的地方了。Windows 下圖形介面程式可以透過像 Autohotkey 或者 AutoIt 等工具來實現自動化控制。 參考文獻 進一步閱讀 外部引用 Expect on SourceForge current Official homepage very outdated The Tclers Wiki Expect page Perl Expectpm module Pexpect a Pure Python Expectlike module Expect Scripting Tutorial Empty expectlike tool to run commandline interactive programs in UNIX shellscripts Expectlite a wrapper for expect making automation easy quick and fun Bulletproof Reliable CLI interface using Expect ExpectJ a Java implementation of the Unix expect utility Category 指令碼語言 CategoryGUI 自動化