---
(警語:本人沒有 PTT 帳號,此文所舉的例子,實際發生的時間是十幾年前我還在念大學的時代,對象應該是台大椰林風情BBS或是台大電機BBS。強烈不建議大家惡搞,文中將另舉本人應用於工作上的例子)
不記得當年是怎麼知道 expect 的了,總之它是一個建構在 Tcl 之上的工具,非常適合把「交談式」的指令給全自動化。
(所謂的交談式,就好比妳用 telnet, ssh, ftp 連上機器之後下一堆指令。)
這個東東最基本的就是兩招: expect 跟 send 。(喔,要生出 process 還要會 spawn 啦)
我們人腦會告訴雙手:如果看到「請輸入帳號」就打 "AustinPowers" ,看到「請輸入密碼」就打 "Yeah,baby,yeah!"
那麼在 expect 的語法,就變成兩組的 expect 跟 send ;頭一次 expect 「請輸入帳號」send AustinPowers[enter],再來 expect 「請輸入密碼」send Yeah,baby,yeah![enter]
當時靈機一動,想說:那我不就可以從我在宿舍的 Linux ,用 expect 寫個自動登入學校的 BBS ,輸入帳號,輸入密碼,然後登出的 script 來玩玩?
結果,不用一個小時,我的上站次數一下子增加了一千多次吧。
不蓋妳,一點都不爽。
我反而覺得很失落,有種自己一鍵一鍵 key 出來的,真實累積的BBS哈啦歲月,被自己寫的 script 給強X的感覺 Orz......)
印象中當年我好像有買 Exploring Expect 這本英文書?
======時光飛逝分隔線======
現在在工作上,我還會用到 expect 喔,用 expect 寫一些簡單的 script ,spawn 一個 telnet 或是 ssh ,然後登入一些 Unix / Linux 機器去執行一些指令。
後來我發現, expect 有一個叫做 autoexpect 的工具,可以幫助妳很快生出妳的 script。
基本上,autoexpect 它會"錄"下你的動作,預設存在script.exp這個檔案
最快的方法,就是用它開一個shell連上某個bbs站
$ autoexpect telnet bbs.ntu.edu.tw
(接下來按一般程序登入,貼一篇文章到測試板,然後登出)
回到提示符號之後,去看看script.exp,答案就在其中了。當然, autoexpect 並非聖賢,我的經驗是它會雞婆,多放很多組的 expect send ,把那些刪掉就是囉。
喔, expect 這個工具其實在 MS Windows 上面也是可以跑的,我是安裝Cygwin,然後要記得把expect套件也勾選(在 Interpreters 這個 Category,我現在裝的版本號是 20030128-1 )就可以在Windows下用expect/autoexpect了。
======
底下這段是手上的一個 .exp 檔的開頭,我把一些敏感的字串換掉了,給大家當個參考。
#!/usr/local/bin/expect -f -c
set timeout -1
spawn $env(SHELL)
match_max 100000
send -- "telnet 192.168.193.102"
expect -exact "192.168.193.102"
send -- "\r"
expect -exact "login: "
send -- "austinpowers\r"
expect -exact "austinpowers\r
Password: "
send -- "Yeah,baby,yeah!\r"
expect -exact "\$ "