python遠(yuǎn)程登錄代碼
在 python 中有一個(gè) telnetlib,它的作用就是建立一個(gè)通到主機(jī)的 telnet連線實(shí)體, 然后向主機(jī)傳送命令 (就像用鍵盤(pán)輸入一樣 )并從該連線接收數(shù)據(jù)。利用它, 我們可以把示范 1的所有內(nèi)容從 "人 -機(jī) '交流變成'機(jī) -機(jī) '交流,這樣也可以做到處理 pop3 郵箱的工作。不過(guò)既然我們已經(jīng)試過(guò)了 pop3,這一次可以試用真的 telnet 埠 23 做些好玩的東西。
# telnetdo.py #!/usr/bin/env python def telnetdo(HOST=None, USER=None, PASS=None, COMMAND=None): #定義一個(gè)函數(shù), 這將要用它會(huì)很容易 import telnetlib, sys if not HOST: #如果沒(méi)有給出所要的資料,則要求用戶輸入 try: HOST = sys.argv[1] #記得吧, 序列是從 0開(kāi)始數(shù)的,而sys.argv[0]會(huì)是你程式的名字 USER = sys.argv[2] PASS = sys.argv[3] COMMAND = sys.argv[4] except: print "Usage: telnetdo.py host user pass 'command'" return msg = ['Debug mesages:\n'] #這個(gè)用來(lái)存起所有從主機(jī)傳回的訊息, 作除錯(cuò)時(shí)很有用 tn = telnetlib.Telnet() #準(zhǔn)備一個(gè) telnet 連線的實(shí)體 try: tn.open(HOST) #連接端綁定到主機(jī) HOST 去 except: print "Cannot open host" return msg.append(tn.expect(['login:'],5)) #等待主機(jī)傳回含有 'login:'字符的訊息,等候時(shí)限為 5秒 tn.write(USER+'\n') #向主機(jī)送出字串 USER + '\n',如 USER 是 # 'pcheung' 則等于 'pcheung\n' if PASS: #就像是在鍵盤(pán)打入一樣。 msg.append(tn.expect(['Password:'],5)) #如果有 password 要打的話就送出密碼字串, tn.write(PASS+'\n') #但首先要等主機(jī)傳回含有 'Password:'字樣的訊息 msg.append(tn.expect([USER],5)) #因?yàn)橥ǔ5侨牒笾鳈C(jī)會(huì)顯示出登入者名稱(chēng),我們?cè)谥鳈C(jī)回應(yīng)中找這 #樣的字符,如有的話則代表登入成功了 tn.write(COMMAND+'\n') #向主機(jī)發(fā)出指令 msg.append(tn.expect(['%'],5)) #等 5秒,如果程式完成了一般我們會(huì)收到 # shell prompt 吧,假設(shè)為 '%' tn.close() #關(guān)閉連線 del tn return msg[len(msg)-1][2] #把收到的訊息通通傳回去。 #(注意 msg 中第 2個(gè)元素才是真的訊息, #其他是附加資訊。 44 if __name__ == '__main__' #這是 python 常用的技巧:如果 telnetdo.py 程式 #是從 command prompt #引發(fā)的話則 __name__ 的內(nèi)容為 __main__,相反 #如果是從別的程式用 import telnetdo 的話則 # __name__ 會(huì)變成 'telnetdo' print telnetdo() #這樣寫(xiě)的好處是從此 telnetdo 會(huì)成為你的擴(kuò)展 #模組,你可以在別的程式中 #用telnetdo.telnetdo(HOST,USER,PASS,COMMAND)來(lái)調(diào)用它!
這個(gè)程式用法如下:
> chmod +x telnetdo.py
> telnetdo.py 'somehost' 'glace' 'xxxxxx' 'ls -lF'
(0, <SRE_Match object at 200f75a8>, '\015\012\015\012Linux
(somehost)\015\012\015\015\012\015login: ')
(0, <SRE_Match object at 20124848>, 'Password:')
(0, <SRE_Match object at 20103e08>, '\015\012Yup Release 2.6
somehost\015\012Last login: Wed Mar 6 18:21:01 GMT 2002 by
UNKNOWN@xxx.xxx.xxx.xxxyou have mail\015\012somehost:glace%')
total 320
-rw-r--r-- 1 glace user 139788 Feb 8 17:54 PQR2.1.txt
drwxr-xr-x 3 glace user 4096 Feb 10 16:45 mytts/
drwxr-xr-x 3 glace user 4096 Jan 29 19:03 sample/
drwxr-xr-x 2 glace user 4096 Jan 6 16:38 tex/
drwxr-xr-x 2 glace user 4096 Sep 5 2001 tmp/
drwxr-xr-x 2 glace user 29 Feb 23 2001 tools/
drwxr-xr-x 2 glace user 26 Feb 6 18:43 trash/
somehost:glace%
可以看到執(zhí)行的結(jié)果和一些附加的資訊。這就是遠(yuǎn)端執(zhí)行程式了。就算沒(méi)有 rsh,照用可也。 哈,很方便吧。不過(guò)你應(yīng)該留意到了程式執(zhí)行時(shí)只等候了 5秒,就是說(shuō)如果你要向主機(jī)發(fā)出像'find . -name xxx -print'這樣的命令應(yīng)該等不到執(zhí)行完這個(gè) telnet session 就會(huì)被關(guān)閉了。不過(guò)仔細(xì)想一下,這要緊嗎?我們現(xiàn)在所能做到的和真正人手 telnet 的差別并不大,想一想你會(huì)怎樣解決長(zhǎng)時(shí)間執(zhí)行的問(wèn)題?沒(méi)錯(cuò),就是 'nohup'和背景作業(yè)了。 就是說(shuō)只要把程式呼叫改成: telnetdo.py 'apocal' 'pcheung' 'xxxxxx' 'nohup myprogram_or_scrīpt&' 就行了。如此一來(lái),就算對(duì)方主機(jī)的 shell prompt 是 '>'或是 '>>>'都沒(méi)有關(guān)系了。
(注意安全性并非是這類(lèi)范例程式的著重點(diǎn), 因此并不建議在實(shí)際工作中用它.)
python中telnetlib模塊的使用
python下能支持telnet的模塊telnetlib是內(nèi)置模塊,直接import就可以了,其基本的使用方法也是比較簡(jiǎn)單的。
#encoding=utf-8 def do_telnet(Host, username, password, finish, commands): import telnetlib '''''Telnet遠(yuǎn)程登錄:Windows客戶端連接Linux服務(wù)器''' # 連接Telnet服務(wù)器 tn = telnetlib.Telnet(Host, port=23, timeout=10) tn.set_debuglevel(2) # 輸入登錄用戶名 tn.read_until('login: ') tn.write(username + '\n') # 輸入登錄密碼 tn.read_until('password: ') tn.write(password + '\n') # 登錄完畢后執(zhí)行命令 tn.read_until(finish) for command in commands: tn.write('%s\n' % command) #執(zhí)行完畢后,終止Telnet連接(或輸入exit退出) tn.read_until(finish) tn.close() # tn.write('exit\n') if __name__=='__main__': # 配置選項(xiàng) Host = '10.255.254.205' # Telnet服務(wù)器IP username = 'administrator' # 登錄用戶名 password = 'dell1950' # 登錄密碼 finish = ':~$ ' # 命令提示符 commands = ['echo "test"'] do_telnet(Host, username, password, finish, commands)
其中port和timeout是可選的參數(shù),而timeout的只是在初始化socket連接時(shí)起作用,而一旦連接成功后如果出現(xiàn)等待那就不會(huì)起作用了,比如使用read_until方式獲取內(nèi)容時(shí)返回的內(nèi)容與指定的內(nèi)容沒(méi)有吻合,那么就會(huì)造成提示等待的情況,這時(shí)timeout是不會(huì)起作用的,而這個(gè)socket連接會(huì)一直保持著,永生不死。
那么如何解決這個(gè)問(wèn)題呢,其實(shí)還有一種比較原始的方法,就是使用sleep方法來(lái)代替read_until方法,這樣就不會(huì)出現(xiàn)種情況,因?yàn)榈近c(diǎn)就會(huì)自己輸入,最多也就是最后得不到想要的結(jié)果,但是這個(gè)方式很不穩(wěn)定,兼容性也不好;另一種方法是使用線程來(lái)啟動(dòng)這個(gè)函數(shù),然后對(duì)子線程進(jìn)行超時(shí)設(shè)置,這樣就可以達(dá)到間接控制這個(gè)telnet連接的目的了。
import threading pars = replace_db_keyworlds(vars_dict, pars) configs = pars.split(r'@') host = configs[0].encode() user = configs[1] passwd = configs[2] finish = configs[3] commands = configs[4].split(r'\n') th1 = threading.Thread(target=do_telnet, args=(host.encode('utf-8'), user.encode('utf-8'), passwd.encode('utf-8'), finish.encode('utf-8'), commands)) th1.start() th1.join(20) ##20秒超時(shí)時(shí)間
還有一個(gè)需要注意的是,傳遞給Telnet方法的字符串都會(huì)被解一次碼,所以如果你傳遞過(guò)去需要write的字符串是已經(jīng)解碼的unicode的話,那么就會(huì)報(bào)錯(cuò)的,所以在傳遞發(fā)送的字符串之前還是先編成utf-8為妥,其它字符不知道支持不,我只試了utf-8,也沒(méi)看源碼。
此外,貌似還有一個(gè)pexpect的第三方模塊可以支持telnet等一系列的協(xié)議連接,并支持交互式的通信,只是這個(gè)模塊夠用就沒(méi)學(xué)習(xí)了,這里先備注一下。
- python 監(jiān)控服務(wù)器是否有人遠(yuǎn)程登錄(詳細(xì)思路+代碼)
- python pexpect ssh 遠(yuǎn)程登錄服務(wù)器的方法
- 用python寫(xiě)個(gè)自動(dòng)SSH登錄遠(yuǎn)程服務(wù)器的小工具(實(shí)例)
- 使用python的pexpect模塊,實(shí)現(xiàn)遠(yuǎn)程免密登錄的示例
- 使用python Telnet遠(yuǎn)程登錄執(zhí)行程序的方法
- Python實(shí)現(xiàn)的遠(yuǎn)程登錄windows系統(tǒng)功能示例
- python SSH模塊登錄,遠(yuǎn)程機(jī)執(zhí)行shell命令實(shí)例解析
- 用Python遠(yuǎn)程登陸服務(wù)器的步驟
相關(guān)文章
Python列表reverse()函數(shù)使用方法詳解
這篇文章主要詳細(xì)介紹了Python列表reverse()函數(shù)使用方法,文章通過(guò)代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-07-07Python實(shí)現(xiàn)的尋找前5個(gè)默尼森數(shù)算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的尋找前5個(gè)默尼森數(shù)算法,簡(jiǎn)單講述了默尼森數(shù)的概念,并結(jié)合實(shí)例形式分析了Python求解默尼森數(shù)算法的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python真題案例之最長(zhǎng)回文子串 周期串詳解
今天來(lái)記錄一下字符串處理中常見(jiàn)到的回文子串與周期串問(wèn)題。使用的語(yǔ)言是Python優(yōu)雅的處理字符串是程序員不可或缺的技能,快來(lái)一起學(xué)習(xí)吧2022-03-03python在協(xié)程中增加任務(wù)實(shí)例操作
在本篇文章里小編給大家整理的是一篇關(guān)于python在協(xié)程中增加任務(wù)實(shí)例操作內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02利用Python的tkinter模塊實(shí)現(xiàn)界面化的批量修改文件名
這篇文章主要介紹了利用Python的tkinter模塊實(shí)現(xiàn)界面化的批量修改文件名,用Python編寫(xiě)過(guò)批量修改文件名的腳本程序,代碼很簡(jiǎn)單,運(yùn)行也比較快,詳細(xì)內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容2022-08-08Python無(wú)頭爬蟲(chóng)下載文件的實(shí)現(xiàn)
這篇文章主要介紹了Python無(wú)頭爬蟲(chóng)下載文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python根據(jù)輸入?yún)?shù)計(jì)算結(jié)果的實(shí)例方法
在本篇文章里小編個(gè)大家整理了一篇關(guān)于Python根據(jù)輸入?yún)?shù)計(jì)算結(jié)果的實(shí)例方法,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-08-08python將中文數(shù)字轉(zhuǎn)化成阿拉伯?dāng)?shù)字的簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于python如何將中文數(shù)字轉(zhuǎn)化成阿拉伯?dāng)?shù)字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03