1. 程式人生 > >python中telnetlib模組的使用

python中telnetlib模組的使用

python下能支援telnet的模組telnetlib是內建模組,直接import就可以了,其基本的使用方法也是比較簡單的。

#encoding=utf-8

def do_telnet(Host, username, password, finish, commands):
    import telnetlib
    '''Telnet遠端登入:Windows客戶端連線Linux伺服器'''
 
    # 連線Telnet伺服器
    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')
      
    # 登入完畢後執行命令
    tn.read_until(finish)
    for command in commands:
        tn.write('%s\n' % command)
    
    #執行完畢後,終止Telnet連線(或輸入exit退出)
    tn.read_until(finish)
    tn.close() # tn.write('exit\n')

if __name__=='__main__':
	 # 配置選項
	Host = '10.255.254.205' # Telnet伺服器IP
	username = 'administrator'   # 登入使用者名稱
	password = 'dell1950'  # 登入密碼
	finish = ':~$ '      # 命令提示符
	commands = ['echo "test"']
	do_telnet(Host, username, password, finish, commands)
其中port和timeout是可選的引數,而timeout的只是在初始化socket連線時起作用,而一旦連線成功後如果出現等待那就不會起作用了,比如使用read_until方式獲取內容時返回的內容與指定的內容沒有吻合,那麼就會造成提示等待的情況,這時timeout是不會起作用的,而這個socket連線會一直保持著,永生不死。

那麼如何解決這個問題呢,其實還有一種比較原始的方法,就是使用sleep方法來代替read_until方法,這樣就不會出現種情況,因為到點就會自己輸入,最多也就是最後得不到想要的結果,但是這個方式很不穩定,相容性也不好;另一種方法是使用執行緒來啟動這個函式,然後對子執行緒進行超時設定,這樣就可以達到間接控制這個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秒超時時間

還有一個需要注意的是,傳遞給Telnet方法的字串都會被解一次碼,所以如果你傳遞過去需要write的字串是已經解碼的unicode的話,那麼就會報錯的,所以在傳遞傳送的字串之前還是先編成utf-8為妥,其它字元不知道支援不,我只試了utf-8,也沒看原始碼。


此外,貌似還有一個pexpect的第三方模組可以支援telnet等一系列的協議連線,並支援互動式的通訊,只是這個模組夠用就沒學習了,這裡先備註一下。