因為 python 已內建了一個 pop3 的函式庫,所以我們直接用它來完成郵件的下載和處理。事實上, 如果我們不用 poplib 的話,我們還是可以完成那個例子中的所有作業:就是通過模擬 telnet的協定。
在python中有一個telnetlib,它的作用就是建立一個通到主機的telnet連線實體,然后向主機傳送命令(就像用鍵盤輸入一樣)并從該連線接收數據。利用它,我們可以把示范1的所有內容從"人-機'交流變成'機-機'交流,這樣也可以做到處理pop3郵箱的工作。不過既然我們已經試過了pop3,這一次可以試用真的telnet埠23做些好玩的東西。
以下是代碼片段:1#telnetdo.py2#!/usr/bin/envpython34deftelnetdo(HOST=None,USER=None,PASS=None,COMMAND=None):#定義一個函數,這將要用它會很容易5importtelnetlib,sys67ifnotHOST:#如果沒有給出所要的資料,則要求用戶輸入8try:9HOST=sys.argv[1]#記得吧,序列是從0開始數的,而sys.argv[0]會是你程式的名字10USER=sys.argv[2]11PASS=sys.argv[3]12COMMAND=sys.argv[4]13except:14print"Usage:telnetdo.pyhostuserpass'command'"15return1617msg=['Debugmesages:/n']#這個用來存起所有從主機傳回的訊息,作除錯時很有用1819tn=telnetlib.Telnet()#準備一個telnet連線的實體20try:21tn.open(HOST)#連接端綁定到主機HOST去22except:23print"Cannotopenhost"24return2526msg.append(tn.expect(['login:'],5))#等待主機傳回含有'login:'字符的訊息,等候時限為5秒27tn.write(USER+'/n')#向主機送出字串USER+'/n',如USER是28#'pcheung'則等于'pcheung/n'29ifPASS:#就像是在鍵盤打入一樣。30msg.append(tn.expect(['Password:'],5))#如果有password要打的話就送出密碼字串,31tn.write(PASS+'/n')#但首先要等主機傳回含有'Password:'字樣的訊息3233msg.append(tn.expect([USER],5))#因為通常登入后主機會顯示出登入者名稱,我們在主機回應中找這34#樣的字符,如有的話則代表登入成功了35tn.write(COMMAND+'/n')#向主機發出指令36msg.append(tn.expect(['%'],5))#等5秒,如果程式完成了一般我們會收到37#shellprompt吧,假設為'%'38tn.close()#關閉連線39deltn40returnmsg[len(msg)-1][2]#把收到的訊息通通傳回去。41#(注意msg中第2個元素才是真的訊息,42#其他是附加資訊。4344if__name__=='__main__'#這是python常用的技巧:如果telnetdo.py程式45#是從commandprompt46#引發的話則__name__的內容為__main__,相反47#如果是從別的程式用importtelnetdo的話則48#__name__會變成'telnetdo'49printtelnetdo()#這樣寫的好處是從此telnetdo會成為你的擴展50#模組,你可以在別的程式中51#用telnetdo.telnetdo(HOST,USER,PASS,COMMAND)來調用它!
這個程式用法如下:
以下是代碼片段:>chmod+xtelnetdo.py>telnetdo.py'somehost''glace''xxxxxx''ls-lF'(0,,'/015/012/015/012Linux(somehost)/015/012/015/015/012/015login:')(0,,'Password:')(0,,'/015/012YupRelease2.6somehost/015/012Lastlogin:WedMar618:21:01GMT2002byUNKNOWN@xxx.xxx.xxx.xxxyouhavemail/015/012somehost:glace%')total320-rw-r--r--1glaceuser139788Feb817:54PQR2.1.txtdrwxr-xr-x3glaceuser4096Feb1016:45mytts/drwxr-xr-x3glaceuser4096Jan2919:03sample/drwxr-xr-x2glaceuser4096Jan616:38tex/drwxr-xr-x2glaceuser4096Sep52001tmp/drwxr-xr-x2glaceuser29Feb232001tools/drwxr-xr-x2glaceuser26Feb618:43trash/somehost:glace%可以看到執行的結果和一些附加的資訊。這就是遠端執行程式了。就算沒有rsh,照用可也。哈,很方便吧。不過你應該留意到了程式執行時只等候了5秒,就是說如果你要向主機發出像'find.-namexxx-print'這樣的命令應該等不到執行完這個telnetsession就會被關閉了。不過仔細想一下,這要緊嗎?我們現在所能做到的和真正人手telnet的差別并不大,想一想你會怎樣解決長時間執行的問題?沒錯,就是'nohup'和背景作業了。就是說只要把程式呼叫改成:telnetdo.py'apocal''pcheung''xxxxxx''nohupmyprogram_or_script&'就行了。如此一來,就算對方主機的shellprompt是'>'或是'>>>'都沒有關系了。
(注意安全性并非是這類范例程式的著重點,因此并不建議在實際工作中用它.)
新聞熱點
疑難解答