python中telnetlib模塊的使用方式
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ì)一直保持著,永生不死。
【注:read_until有自己的timeout參數(shù),設(shè)置了會(huì)相應(yīng)的生效】
如何解決這個(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,也沒看源碼。
此外,貌似還有一個(gè)pexpect的第三方模塊可以支持telnet等一系列的協(xié)議連接,并支持交互式的通信,只是這個(gè)模塊夠用就沒學(xué)習(xí)了,這里先備注一下。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一個(gè)計(jì)算身份證號(hào)碼校驗(yàn)位的Python小程序
閑著無(wú)事,便想寫個(gè)實(shí)用點(diǎn)的Python小程序,如何計(jì)算機(jī)身份證號(hào)碼的校驗(yàn)位,這樣的文章在網(wǎng)上一抓一大把,這里僅簡(jiǎn)單介紹下吧2014-08-08
Django分頁(yè)功能的實(shí)現(xiàn)代碼詳解
在本篇文章里小編給大家整理了關(guān)于Django分頁(yè)功能的實(shí)現(xiàn)代碼以及相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以跟著學(xué)習(xí)參考下。2019-07-07
python爬蟲學(xué)習(xí)筆記--BeautifulSoup4庫(kù)的使用詳解
這篇文章主要介紹了Python中使用Beautiful Soup庫(kù)的超詳細(xì)教程,示例代碼基于Python2.x版本,極力推薦!需要的朋友可以參考下2021-08-08
python數(shù)據(jù)寫入列表并導(dǎo)出折線圖
這篇文章主要介紹了python數(shù)據(jù)寫入列表并導(dǎo)出折線圖,文章以舉例展開對(duì)文章主題的介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01
Python利用海龜畫圖turtle庫(kù)做一個(gè)籃球比賽計(jì)時(shí)畫面示例代碼
這篇文章主要介紹了Python利用海龜畫圖turtle庫(kù)做一個(gè)籃球比賽計(jì)時(shí)畫面的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),代碼實(shí)現(xiàn)了一個(gè)基本的計(jì)時(shí)器功能,需要的朋友可以參考下2024-12-12
django admin.py 外鍵,反向查詢的實(shí)例
今天小編就為大家分享一篇django admin.py 外鍵,反向查詢的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07

