Sunday, March 1, 2009

用 expect 和 autoexpect 寫 BBS 機器人,衝上站次數

網管的暗黑系法術:用 expect 和 autoexpect 寫 BBS 機器人,衝上站次數
(警語:本人沒有 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 "\$ "




嗯,看來「在 MS Windows 上面跑 (Cygwin 附的) expect/autoexpect 」這件事的卡關點比我想像的多,我簡單記一下:

1. 如果妳的 expect 指令稿會用到 telnet ,不要用 MS Windows 內建的 telnet ,請安裝 Cygwin 的 inetutils 套件(執行 setup.exe 的時候,在 Net 分類底下勾選)。不然,妳就會看到 invalid spawn id (4) 這樣的錯誤訊息。

2. 如果想要用 autoexpect ,在 setup.exe 的 Interpreters 這個分類勾選 expect 的時候,記得要一併勾選 source ,就是在 Src? 底下的那個方框要點選,變成X。安裝好之後, autoexpect 會放在這裡:/usr/src/expect-20030128-1/expect/example/autoexpect
建議妳把它複製到 /usr/bin/ ,並且修改它的第一行,不然不會動喔 :)




哈哈 這很好用喔 我來到我公司時就把一些不能自動
備份的設定檔全都透過 expect 來備份。就連一些設備有沒辦法監控的資訊,都可以透過shell script + expect 來達到監控唷 ~

No comments: