python expect模塊_Python基礎教程:用Python怎么telnet到網絡設備

Python基礎教程:用Python怎么telnet到網絡設備

0.前言

Telnet協議屬于TCP/IP協議族里的一種,對于我們這些網絡攻城獅來說,再熟悉不過了,常用于遠程登陸到網絡設備進行操作,但是,它的缺陷太明顯了,就是不安全,信息明文傳送,極容易被攻擊竊取信息,不推薦使用,但本節我還是先從它入手哈。

1. 測試環境及關鍵代碼解釋

1.1 簡單測試環境

  • 使用python3環境
  • 使用內置telnetlib模塊
  • 簡單的實驗環境

說明:

cmd.txt文件里面命令如下:

terminal length 0 show clock show ip interface brief

list.txt文件里面的IP如下:

192.168.1.101 192.168.1.102 192.168.1.103

1.2 關鍵代碼

import xx:導入模塊

class xx:定義類

def xx: 定義函數

try-except :處理可能引發的異常

tn.read_until(expected, timeout=None):等待預期字符串或等待超時

tn.write(buffer):寫入的字符串(意思發送給命令給設備)

tn.expect(list, timeout=None):讀顯,list采用正則表達式(意思把執行過程顯示出來)

tn.read_very_eager():讀顯(意思把執行過程顯示出來)

tn.open(host, port=0[, timeout]):連接主機

tn.close():關閉連接

Tips:終端與網絡設備交付的信息是以byte類型,所以要把終端上的字符串encode編碼轉換為byte對象,網絡設備回顯的byte信息要decode解碼。

55a6672e-9f6a-4f3e-8f1b-b4e756c742f8

2. 完整代碼

'''歡迎關注:'333' 此平臺是網路工程師個人日常技術、項目案例經驗分享, 為鞏固及提升技術能力乃至共享所學所知技術 也歡迎各位工程師一起分享、一起成長。'''#!/usr/bin/env python#coding:utf-8'導入模塊'from telnetlib import Telnetimport timeimport logging'定義類'class TelnetClient(): '初始化屬性' def __init__(self): self.tn = Telnet() '定義login_host函數,用于登陸設備' def login_host(self,ip,username,password,enable=None,verbose=True): '連接設備,try-except結構' try: self.tn.open(ip,port=23) except: logging.warning('%s網絡連接失敗' %ip) return False '輸入用戶名' self.tn.read_until(b'Username:', timeout=1) self.tn.write(b'') self.tn.write(username.encode() + b'') rely = self.tn.expect([], timeout=1)[2].decode().strip() #讀顯 if verbose: print(rely) '輸入用戶密碼' self.tn.read_until(b'Password:', timeout=1) self.tn.write(password.encode() + b'') rely = self.tn.expect([], timeout=1)[2].decode().strip() if verbose: print(rely) '進去特權模式' if enable is not None: self.tn.write(b'enable') self.tn.write(enable.encode() + b'') if verbose: rely = self.tn.expect([], timeout=1)[2].decode().strip() print(rely) time.sleep(1) rely = self.tn.read_very_eager().decode() if 'Login invalid' not in rely: logging.warning('%s登陸成功' % ip) return True else: logging.warning('%s登陸失敗,用戶名或密碼錯誤' % ip) return False '定義do_cmd函數,用于執行命令' def do_cmd(self,cmds): '讀取文件,for語句循環執行命令' with open(cmds) as cmd_obj: for cmd in cmd_obj: self.tn.write(cmd.encode().strip() + b'') time.sleep(2) rely = self.tn.read_very_eager().decode() logging.warning('命令執行結果: %s' %rely) '定義logout_host函數,關閉程序' def logout_host(self): self.tn.close()if __name__ == '__main__': username = 'cisco' #用戶名 password = 'cisco' #密碼 enable = 'cisco' #特權密碼 lists = 'list.txt' #存放IP地址文件,相對路徑 cmds = 'cmd.txt' #存放執行命令文件,相對路徑 telnet_client = TelnetClient() '讀取文件,for語句循環登陸IP' with open(lists,'rt') as list_obj: for ip in list_obj: '如果登錄結果為True,則執行命令,然后退出' if telnet_client.login_host(ip.strip(),username,password,enable): telnet_client.do_cmd(cmds) telnet_client.logout_host() time.sleep(2)

3. 運行效果

備注:這個運行的效果我只存放了192.168.1.101這個IP,精簡一下,為了效果。

4. 報錯效果

  • 遠程連接不上
  • 用戶名和密碼錯誤

5. 碎碎念

這些只是一些簡單的代碼,待優化的地方還是很多,先給小伙伴們學習一下,telnet協議是個不安全的,基本網絡環境很少用了,ssh為常用的協議,安全又好用!伙伴們有需要 補充的歡迎留言!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542605.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java實現動態加載頁面_[Java教程]動態加載頁面數據的小工具 javascript + jQuery (持續更新)...

[Java教程]動態加載頁面數據的小工具 javascript jQuery (持續更新)0 2014-05-07 18:00:06使用該控件,可以根據url,參數,加載html記錄模板(包含json參數對應,以及具體記錄位置Index根據參數描述加載對應的屬性,并可以…

馬哥linux第六周作業

1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;[rootmageedu tmp]# cp /etc/rc.d/rc.sysinit . [rootmageedu tmp]# vim rc.sysinit :% s/^[[:space:]]/#&/ #按Esc進入vi…

Java ObjectInputStream enableResolveObject()方法與示例

ObjectInputStream類enableResolveObject()方法 (ObjectInputStream Class enableResolveObject() method) enableResolveObject() method is available in java.io package. enableResolveObject()方法在java.io包中可用。 enableResolveObject() method is used to enable th…

pygame render怎么顯示中文_PyGame開發游戲(2D)02.基礎圖元

這節將介紹PyGame的基礎架構。并學習如何在PyGame里繪制各種幾何圖形和顯示加載圖片。01.應用框架上一節的示例程序里,我們用到一個PyGame的應用程序框架。這是一個基礎框架,利用它我們可以很輕松的添加各類圖型繪制,鍵盤鼠標輸入處理和各類邏…

word+增加水印+java_為Word2019文檔添加水印的兩種方法

水印的類型包括文字水印和圖片水印兩種。在Word文檔中添加文字水印時,可以使用程序中預設的水印效果,而圖片水印則需要自定義添加。一、使用程序預設的文字水印Word 2019中預設了機密、緊急、免責聲明三種類型的文字水印,用戶可根據文件的類型…

如何設置CentOS 7獲取動態及靜態IP地址

自動獲取動態IP地址1.輸入“ip addr”并按回車鍵確定,發現無法獲取IP(CentOS 7默認沒有ifconfig命令),記錄下網卡名稱(本例中為ens33)。2.輸入“cd /etc/sysconfig/network-scripts/”按回車鍵確定,繼續輸入“ls”按回…

請求列出指定服務器上的可用功能失敗_濫用 ESI 詳解(上)

在進行安全性評估時,我們注意到了標記語言 Edge Side Includes (ESI)中的一個意外行為,這種語言用于許多流行的 HTTP 代理(反向代理、負載平衡器、緩存服務器、代理服務器)。我們發現成功的 ESI 攻擊可以導致服務器端請求偽造(SSRF)、各種繞過 HTTPOnly …

Java ClassLoader setPackageAssertionStatus()方法與示例

ClassLoader類setPackageAssertionStatus()方法 (ClassLoader Class setPackageAssertionStatus() method) setPackageAssertionStatus() method is available in java.lang package. setPackageAssertionStatus()方法在java.lang包中可用。 setPackageAssertionStatus() metho…

java上傳kafka的方法_哪種方法是將所有數據從Kafka主題復制到接收器(文件或Hive表)的最佳方法?...

我正在使用Kafka Consumer API將所有數據從Kafka主題復制到Hive表 . 為此,我使用HDFS作為中間步驟 . 我使用唯一的組ID并將偏移重置為“最早”,以便從頭開始獲取所有數據,并在執行后忽略提交 . 然后我遍歷Kafka主題中的記錄,并將每…

openstack nova-network 的小bug的排錯經歷

環境是 nova-network vmwareflatdhcp錯誤表現為 開出來的虛擬機有一定幾率獲取不到dhcp地址,手工賦予ip則正常,用flat模式注入的ip正常,下面是排錯過程1首先找網絡防火墻已經把 dnsmasq對應的端口已經打開抓包結果:可以看到虛擬機…

anaconda base環境_anaconda中安裝packages:pip還是conda install?

conda install我就不說了,這都不會別學了就。Using command:$ which -a pip, the terminal will return:This indicates two different pip path to install packages[1].在tf23環境中pip install在base環境中pip install在windows下powershell內,進入到…

Java ClassLoader setDefaultAssertionStatus()方法與示例

ClassLoader類setDefaultAssertionStatus()方法 (ClassLoader Class setDefaultAssertionStatus() method) setDefaultAssertionStatus() method is available in java.lang package. setDefaultAssertionStatus()方法在java.lang包中可用。 setDefaultAssertionStatus() metho…

【風馬一族_xml】xmlp之dtd1

什么是XML約束?在xml技術里,可以編寫一個文檔來約束一個xml文檔的寫法,這稱之為xml約束 2. 為什么要使用xml約束? 參看提示欄 3. xml約束的作用? 約束xml的寫法對xml進行校驗4. 常見的xml約束技術 xml dtdxml Schema…

java ssm框架 緩存_SSM框架之MyBatis3專題4:查詢緩存

查詢緩存的使用,主要是為了提高查詢訪問速度。將用戶對同一數據的重復查詢過程簡化,不再每次均從數據庫中查詢獲取結果數據,從而提高訪問速度。MyBatis的查詢緩存機制,根據緩存區的作用域(聲明周期)可劃分為兩種:一級查…

matplotlib畫圖_漂亮,超詳細的matplotlib畫圖基礎

來自 | 逐夢erhttps://zhumenger.blog.csdn.net/article/details/106530281本文僅作技術交流,如有侵權,請聯系后臺刪除。數據可視化非常重要,因為錯誤或不充分的數據表示方法可能會毀掉原本很出色的數據分析工作。matplotlib 庫是專門用于開發…

c# 2維數組 取一維_C#| 不同類型的一維數組聲明

c# 2維數組 取一維In the below example, we are declaring an integer array (one dimensional) with following styles: 在下面的示例中,我們聲明具有以下樣式的整數數組(一維) : 1) One dimensional Array declaration with initialization (without…

Java編程經典10道_Java經典編程題50道之十二

企業發放的獎金根據利潤提成:利潤(I)低于或等于10萬元時,獎金可提10%;利潤高于10萬元,低于20萬元時,低于10萬元的部分按10%提成, 高于10萬元的部分 ,可提成7.5%;20萬到40萬之間時&am…

RHEL7 單獨安裝圖形 X11

RHEL7 默認是最小化安裝(Minimal Install),沒有圖形界面, 我們應該選擇Server with GUI。若已錯過此步驟,我們采用以下方式補充安裝GUI界面。 先配置yum源可以參考我的這篇文章http://blog.itpub.net/27771627/viewspa…

android recycleview長按多選_UI設計中Android和IOS設計差異總結

由于設計師、產品經理使用的移動設備大部分是iPhone,所以在做設計時,容易忽略Android和iOS的差異,按照iOS的規范進行設計,兩端只做一套。只做一套的會存在兩個問題:1、安卓用戶的使用習慣不太適應iOS的設計&#xff0c…

Kotlin程序用于打印JVM版本的Kotlin(打印Java屬性)

Here, we will create a Kotlin program to print Kotlin, JVM version (printing Java properties). As Kotlin can be seen as an upgrade of Java, so we will get all versions of java (JVM) using Kotlin also. 在這里,我們將創建一個Kotlin程序以打印JVM版本…