国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python遠(yuǎn)程登錄代碼

2019-11-25 18:47:01
字體:
供稿:網(wǎng)友

在 python 中有一個(gè) telnetlib,它的作用就是建立一個(gè)通到主機(jī)的 telnet連線實(shí)體, 然后向主機(jī)傳送命令 (就像用鍵盤輸入一樣 )并從該連線接收數(shù)據(jù)。利用它, 我們可以把示范 1的所有內(nèi)容從 "人 -機(jī) '交流變成'機(jī) -機(jī) '交流,這樣也可以做到處理 pop3 郵箱的工作。不過既然我們已經(jīng)試過了 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:              #如果沒有給出所要的資料,則要求用戶輸入              try:        HOST  = sys.argv[1]         #記得吧, 序列是從 0開始數(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è)用來存起所有從主機(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:                 #就像是在鍵盤打入一樣。      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ì)顯示出登入者名稱,我們?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()             #這樣寫的好處是從此 telnetdo 會(huì)成為你的擴(kuò)展                         #模組,你可以在別的程式中                           #用telnetdo.telnetdo(HOST,USER,PASS,COMMAND)來調(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í)行程式了。就算沒有 rsh,照用可也。 哈,很方便吧。不過你應(yīng)該留意到了程式執(zhí)行時(shí)只等候了 5秒,就是說如果你要向主機(jī)發(fā)出像'find . -name xxx   -print'這樣的命令應(yīng)該等不到執(zhí)行完這個(gè) telnet session 就會(huì)被關(guān)閉了。不過仔細(xì)想一下,這要緊嗎?我們現(xiàn)在所能做到的和真正人手 telnet 的差別并不大,想一想你會(huì)怎樣解決長(zhǎng)時(shí)間執(zhí)行的問題?沒錯(cuò),就是 'nohup'和背景作業(yè)了。 就是說只要把程式呼叫改成: telnetdo.py 'apocal' 'pcheung' 'xxxxxx' 'nohup   myprogram_or_scrīpt&' 就行了。如此一來,就算對(duì)方主機(jī)的 shell prompt 是 '>'或是 '>>>'都沒有關(guān)系了。

(注意安全性并非是這類范例程式的著重點(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)容沒有吻合,那么就會(huì)造成提示等待的情況,這時(shí)timeout是不會(huì)起作用的,而這個(gè)socket連接會(huì)一直保持著,永生不死。

那么如何解決這個(gè)問題呢,其實(shí)還有一種比較原始的方法,就是使用sleep方法來代替read_until方法,這樣就不會(huì)出現(xiàn)種情況,因?yàn)榈近c(diǎn)就會(huì)自己輸入,最多也就是最后得不到想要的結(jié)果,但是這個(gè)方式很不穩(wěn)定,兼容性也不好;另一種方法是使用線程來啟動(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ì)被解一次碼,所以如果你傳遞過去需要write的字符串是已經(jīng)解碼的unicode的話,那么就會(huì)報(bào)錯(cuò)的,所以在傳遞發(fā)送的字符串之前還是先編成utf-8為妥,其它字符不知道支持不,我只試了utf-8,也沒看源碼。

此外,貌似還有一個(gè)pexpect的第三方模塊可以支持telnet等一系列的協(xié)議連接,并支持交互式的通信,只是這個(gè)模塊夠用就沒學(xué)習(xí)了,這里先備注一下。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东乡族自治县| 曲水县| 武平县| 阿图什市| 阜康市| 宜都市| 保定市| 延吉市| 秦皇岛市| 连南| 焦作市| 麻阳| 平谷区| 朝阳市| 高唐县| 来安县| 湄潭县| 凌海市| 海安县| 淮北市| 大厂| 昆明市| 莱阳市| 阿勒泰市| 瑞安市| 德格县| 合江县| 香港| 新和县| 安溪县| 百色市| 贺州市| 柳林县| 德兴市| 金沙县| 隆化县| 罗江县| 财经| 聊城市| 罗定市| 西充县|