0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python練手小程序

網(wǎng)絡(luò)技術(shù)干貨圈 ? 來(lái)源:網(wǎng)絡(luò)技術(shù)干貨圈 ? 2023-01-09 09:49 ? 次閱讀

如果管理網(wǎng)絡(luò)設(shè)備很多,不可能靠人力每天去登錄設(shè)備去查看是否在線。所以,可以利用python腳本通過(guò)每天掃描網(wǎng)絡(luò)中的在線設(shè)備??梢圆渴鹪诜?wù)器上做成定時(shí)任務(wù),每天發(fā)送AAA巡檢報(bào)告。

下面是我寫的一個(gè)python練手小程序。用來(lái)掃描一個(gè)網(wǎng)段中的在線主機(jī),并嘗試AAA去登錄。統(tǒng)計(jì)一個(gè)大網(wǎng)段內(nèi)可以成功aaa登錄的主機(jī)。

注意:

該程序只是測(cè)試小程序,還有些小bug需要解決。不是通用的程序。主要提供一個(gè)大致思路。

主要用到了python-nmap, paramiko庫(kù)。

程序大概思路:

  1. 利用nmap掃描一個(gè)指定網(wǎng)段,只做ping掃描,所以前提所管理的設(shè)備中ping必須開啟。獲取存活設(shè)備IP列表。
  2. 利用paramiko庫(kù)模擬ssh去登錄個(gè)IP,如果登錄成功,返回設(shè)備名稱,并及將設(shè)備名稱和對(duì)應(yīng)ip寫入文件。

代碼示例:

#-*-coding:utf-8-*-

importnmap
importdatetime
importparamiko
importre

defget_name(host,user,password,port=22):
client=paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#client.connect(host,port,user,password,allow_agent=False,look_for_keys=False,timeout=5)
try:
client.connect(ip,port,user,password,allow_agent=False,look_for_keys=False,timeout=3)
exceptExceptionaserr:
return0,str(err)
#getshell
ssh_shell=client.invoke_shell()

dev_name=''
whileTrue:
line=ssh_shell.recv(1024)
ifline.endswith(b'>'):#華為華三
dev_name=re.findall(r'<(.*)>',str(line))[0]
#dev_name=str(line)[3:-2]
break
ifline.endswith(b'#')|line.endswith(b'#'):#思科
dev_name=re.findall(r'[\r\n|\r]+(.*)#',str(line))[0]
break
ifline.endswith(b'>'):
if'ConnetOS'instr(line):#分流器
dev_name=re.findall(r'[\r\n|\r]+(.*)>',str(line))[0].strip()
if'@'instr(line):#junpier防火墻
dev_name=re.findall(r'@(.*)>',str(line))[0].strip()
break
#怎么跳出recv阻塞
ssh_shell.close()
return1,dev_name


#print('掃描時(shí)間:'+res['nmap']['scanstats']['timestr']+'
命令參數(shù):'+res['nmap']['command_line'])

defget_ip_list(hosts):
nm=nmap.PortScanner()
#nmap填入?yún)?shù)列表可以填很多
res=nm.scan(hosts=hosts,arguments='-sn-PE')
#count=res['nmap']['scanstats']['uphosts']#存活的主機(jī)數(shù)
returnlist(res['scan'].keys())#存活主機(jī)IP地址


if__name__=='__main__':
start=datetime.datetime.now()
user='user'
password='password'
hosts='10.0.0.0/24'
dev={}#存放AAA登錄成功的主機(jī)
f=open('ip_list.txt','w')#存放能ping通的IP
ip_list=get_ip_list(hosts)
end=datetime.datetime.now()
#f.write("存活的IP地址有:"+ str(len(ip_list))+"
")
#f.write("程序運(yùn)行時(shí)間:"+ str(end-start)+'
')
foripinip_list:
f.write(ip+'
')
f.close()
#print(ip_list)
login_failed_count=0
f1=open('login_succeed.txt','w',encoding='utf-8')
f2=open('login_failed.txt','w',encoding='utf-8')
f3=open('mtil_add.txt','w',encoding='utf-8')
#ip_list=ip_list.split('
')
foripinip_list:
ok,dev_name=get_name(ip,user,password)
ifok==1:
ifdev_namenotindev.keys():
vendor=''
print(dev_name+"		"+ip)
if'h'indev_name[-12:]:
vendor='h3c'
elif'c'indev_name[-12:]:
vendor='cisco'
elif'w'indev_name[-12:]:
vendor='huawei'
else:
vendor='unknow'
f1.write(dev_name+'		'+ip+'	'+vendor+'
')
f1.flush()
dev.update({dev_name:ip})
else:
f3.write(dev_name+'		'+str(dev[dev_name])+''+ip+'
')
print(dev_name+'		'+str(dev[dev_name])+''+ip+'
')
dev.update({dev_name:[dev[dev_name],ip]})
f3.flush()
else:
login_failed_count+=1
print(dev_name)
f2.write(dev_name+'		'+ip+'
')
f2.flush()
end=datetime.datetime.now()
f1.write('AAA登錄成功'+str(len(dev))+'臺(tái)
')
f1.write('AAA登錄失敗'+str(login_failed_count)+'臺(tái)
')
f1.write("程序運(yùn)行時(shí)間:"+str(end-start)+'
')
f1.close()
f2.close()
f3.close()

print("程序運(yùn)行時(shí)間:"+str(end-start)+'
')
print("存活的IP地址有:"+str(len(ip_list))+"
")
print("AAA登錄成功:"+str(len(dev))+"
")
print('AAA登錄失敗'+str(login_failed_count)+'臺(tái)
')

這個(gè)小程序例子,只是一個(gè)大概思路。

可以添加或則改善的思路:

  • 比想要獲取設(shè)備名,可以通過(guò)snmp,知道ip地址和snmp讀團(tuán)體名就可以直接獲取。
  • 可以將獲取到的數(shù)據(jù)存入數(shù)據(jù)庫(kù)中,從而可以做更的事情。
  • 通過(guò)類似代碼,也可以實(shí)現(xiàn)每天去設(shè)備上備份網(wǎng)絡(luò)配置等功能。
  • 可以將利用掃描結(jié)果,添加更多處理邏輯,生成每日巡檢日?qǐng)?bào),通過(guò)郵件或者短信發(fā)送。

nmap庫(kù)使用:

nmap工具使用可參考:nmap掃描工具學(xué)習(xí)筆記

如果在windows上寫nmap庫(kù),有兩個(gè)事要解決。

第一步:安裝nmap軟件

因?yàn)樵趐ython程序中,nmap包所調(diào)用的是nmap可執(zhí)行程序,所以必須先安裝nmap軟件。nmap下載地址:https://nmap.org/download.html

第二步: 需要在nmap庫(kù)中文件的init方法中添加的nmap.exe的路徑。

不然會(huì)報(bào)錯(cuò),提示找不到nmap。

在nmap.py的class PortScanner()中的__init__()中更改:

def__init__(self,nmap_search_path=('nmap','/usr/bin/nmap','/usr/local/bin/nmap','/sw/bin/nmap','/opt/local/bin/nmap',r"D:software
map-7.80
map.exe")):

主要添加了‘r"D:software map-7.80 map.exe", nmap.exe可執(zhí)行文件路徑。


importnmap
nm=nmap.PortScanner()
#nmap填入?yún)?shù)列表可以填很多
res=nm.scan(hosts=hosts,arguments='-sn-PE')

其他使用示例:

#!/usr/bin/envpython
importnmap#importnmap.pymodule
nm=nmap.PortScanner()#instantiatenmap.PortScannerobject
nm.scan('127.0.0.1','22-443')#scanhost127.0.0.1,portsfrom22to443
nm.command_line()#getcommandlineusedforthescan:nmap-oX--p22-443127.0.0.1
nm.scaninfo()#getnmapscaninformations{'tcp':{'services':'22-443','method':'connect'}}
nm.all_hosts()#getallhoststhatwerescanned
nm['127.0.0.1'].hostname()#getonehostnameforhost127.0.0.1,usualytheuserrecord
nm['127.0.0.1'].hostnames()#getlistofhostnamesforhost127.0.0.1asalistofdict
#[{'name':'hostname1','type':'PTR'},{'name':'hostname2','type':'user'}]
nm['127.0.0.1'].hostname()#gethostnameforhost127.0.0.1
nm['127.0.0.1'].state()#getstateofhost127.0.0.1(up|down|unknown|skipped)
nm['127.0.0.1'].all_protocols()#getallscannedprotocols['tcp','udp']in(ip|tcp|udp|sctp)
nm['127.0.0.1']['tcp'].keys()#getallportsfortcpprotocol
nm['127.0.0.1'].all_tcp()#getallportsfortcpprotocol(sortedversion)
nm['127.0.0.1'].all_udp()#getallportsforudpprotocol(sortedversion)
nm['127.0.0.1'].all_ip()#getallportsforipprotocol(sortedversion)
nm['127.0.0.1'].all_sctp()#getallportsforsctpprotocol(sortedversion)
nm['127.0.0.1'].has_tcp(22)#isthereanyinformationforport22/tcponhost127.0.0.1
nm['127.0.0.1']['tcp'][22]#getinfosaboutport22intcponhost127.0.0.1
nm['127.0.0.1'].tcp(22)#getinfosaboutport22intcponhost127.0.0.1
nm['127.0.0.1']['tcp'][22]['state']#getstateofport22/tcponhost127.0.0.1(open

審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8849

    瀏覽量

    84950
  • 網(wǎng)絡(luò)設(shè)備

    關(guān)注

    0

    文章

    304

    瀏覽量

    29554
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84289
  • 小程序
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    12065

原文標(biāo)題:網(wǎng)絡(luò)設(shè)備那么多,我用Python定時(shí)掃描網(wǎng)絡(luò)中的在線設(shè)備,每天發(fā)送AAA巡檢報(bào)告

文章出處:【微信號(hào):網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號(hào):網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用linux下gdb來(lái)調(diào)試python程序

    如何使用linux下gdb來(lái)調(diào)試python程序? 在Linux下,可以使用GDB(GNU調(diào)試器)來(lái)調(diào)試Python程序。GDB是一個(gè)強(qiáng)大的調(diào)試工具,可以幫助開發(fā)者診斷和修復(fù)
    的頭像 發(fā)表于 01-31 10:41 ?2240次閱讀

    Python程序不自動(dòng)關(guān)閉的方法

    有時(shí)候,我們希望Python程序在完成了任務(wù)后不立即自動(dòng)關(guān)閉,而是保持運(yùn)行狀態(tài),以便進(jìn)行進(jìn)一步的操作或觀察程序的輸出。在本文中,我們將探討幾種方法來(lái)實(shí)現(xiàn)這一目標(biāo)。 使用input函數(shù) 最簡(jiǎn)單的方法
    的頭像 發(fā)表于 11-29 15:10 ?4969次閱讀

    python運(yùn)行指定幾行

    Python是一種高級(jí)編程語(yǔ)言,可以用于開發(fā)各種類型的應(yīng)用程序,包括網(wǎng)站、桌面應(yīng)用程序、數(shù)據(jù)分析和人工智能等。在Python中運(yùn)行指定的幾行代碼十分簡(jiǎn)單,它不僅能夠幫助
    的頭像 發(fā)表于 11-29 15:04 ?853次閱讀

    查看python安裝路徑的方法

    。 方法一:使用Python自帶安裝程序的默認(rèn)路徑 Python的安裝程序通常會(huì)將Python解釋器安裝在默認(rèn)的路徑中
    的頭像 發(fā)表于 11-29 14:54 ?1.1w次閱讀

    python程序文件擴(kuò)展名主要有哪兩種

    Python程序文件的擴(kuò)展名主要有兩種,分別是.py和.pyw。 .py擴(kuò)展名: .py是Python程序最常見的擴(kuò)展名,它表示一個(gè)Python
    的頭像 發(fā)表于 11-29 14:30 ?6281次閱讀

    python程序的文件擴(kuò)展名

    Python是一種高級(jí)編程語(yǔ)言,它的文件擴(kuò)展名為.py。在本文中,我們將詳細(xì)討論Python程序文件的擴(kuò)展名,包括其含義、用途以及與其他文件類型的區(qū)別。 首先,讓我們來(lái)了解一下文件擴(kuò)展名的概念。文件
    的頭像 發(fā)表于 11-29 14:25 ?1727次閱讀

    運(yùn)行Python程序的幾種常見方法

    Python是一種高級(jí)編程語(yǔ)言,具有簡(jiǎn)單易學(xué),易于閱讀和調(diào)試的特點(diǎn)。當(dāng)你完成了一個(gè)Python程序之后,你需要運(yùn)行它以檢查程序是否按照預(yù)期工作。下面是運(yùn)行
    的頭像 發(fā)表于 11-28 15:32 ?2144次閱讀

    python運(yùn)行程序出現(xiàn)紅色空白

    當(dāng)你運(yùn)行Python程序時(shí),如果出現(xiàn)紅色空白,這通常意味著有一個(gè)錯(cuò)誤發(fā)生了。這個(gè)錯(cuò)誤可能是由多種原因造成的,本文將詳細(xì)介紹可能的原因和解決方法,幫助你解決這個(gè)問(wèn)題。 語(yǔ)法錯(cuò)誤:Python是一種強(qiáng)
    的頭像 發(fā)表于 11-28 15:30 ?1653次閱讀

    如何運(yùn)行Python程序

    運(yùn)行Python程序非常簡(jiǎn)單。Python是一種解釋型語(yǔ)言,這意味著可以直接通過(guò)解釋器來(lái)執(zhí)行代碼。下面我將詳細(xì)介紹如何運(yùn)行Python程序。
    的頭像 發(fā)表于 11-24 09:31 ?1070次閱讀

    python的run在哪

    Python的run指的是執(zhí)行Python程序的操作,它可以在多個(gè)環(huán)境和平臺(tái)上進(jìn)行,包括命令行、集成開發(fā)環(huán)境(IDE)、Jupyter筆記本、文本編輯器等。下面將詳細(xì)介紹Python
    的頭像 發(fā)表于 11-24 09:27 ?1862次閱讀

    python怎么運(yùn)行程序

    Python是一種廣泛使用的編程語(yǔ)言,它的簡(jiǎn)易和可讀性使得它成為初學(xué)者和專業(yè)開發(fā)人員的首選。在運(yùn)行Python程序之前,您需要安裝Python解釋器,然后按照以下步驟進(jìn)行操作。 步驟1
    的頭像 發(fā)表于 11-24 09:25 ?2429次閱讀

    python如何查看運(yùn)行過(guò)程

    Python是一門高級(jí)編程語(yǔ)言,可以用于開發(fā)各種類型的應(yīng)用程序、網(wǎng)站和數(shù)據(jù)分析。當(dāng)我們編寫并運(yùn)行Python程序時(shí),有時(shí)候需要了解程序執(zhí)行的
    的頭像 發(fā)表于 11-22 11:13 ?1738次閱讀

    python寫完程序之后怎么運(yùn)行

    Python是一門簡(jiǎn)潔、易學(xué)的編程語(yǔ)言,被廣泛應(yīng)用于數(shù)據(jù)分析、人工智能等領(lǐng)域。在學(xué)習(xí)Python編程的過(guò)程中,了解程序的運(yùn)行機(jī)制是至關(guān)重要的。本文將詳盡解析Python
    的頭像 發(fā)表于 11-22 11:10 ?899次閱讀

    泰克科技推出開源Python儀器驅(qū)動(dòng)程序

    泰克科技公司于今天宣布推出開源Python儀器驅(qū)動(dòng)程序包。該軟件包完全免費(fèi),可面向儀器自動(dòng)化應(yīng)用提供原生的Python用戶體驗(yàn)。這款開源Python驅(qū)動(dòng)
    的頭像 發(fā)表于 11-15 15:57 ?592次閱讀

    一行代碼將Python程序轉(zhuǎn)換為圖形界面應(yīng)用

    Gooey項(xiàng)目支持用一行代碼將(幾乎)任何Python 2或3控制臺(tái)程序轉(zhuǎn)換為GUI應(yīng)用程序。 1.快速開始 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以
    的頭像 發(fā)表于 10-30 15:39 ?415次閱讀
    一行代碼將<b class='flag-5'>Python</b><b class='flag-5'>程序</b>轉(zhuǎn)換為圖形界面應(yīng)用