如果管理網(wǎng)絡(luò)設(shè)備很多,不可能靠人力每天去登錄設(shè)備去查看是否在線。所以,可以利用python腳本通過每天掃描網(wǎng)絡(luò)中的在線設(shè)備。可以部署在服務(wù)器上做成定時任務(wù),每天發(fā)送AAA巡檢報告。
下面是我寫的一個python練手小程序。用來掃描一個網(wǎng)段中的在線主機,并嘗試AAA去登錄。統(tǒng)計一個大網(wǎng)段內(nèi)可以成功aaa登錄的主機。
注意:
該程序只是測試小程序,還有些小bug需要解決。不是通用的程序。主要提供一個大致思路。
主要用到了python-nmap, paramiko庫。
程序大概思路:
- 利用nmap掃描一個指定網(wǎng)段,只做ping掃描,所以前提所管理的設(shè)備中ping必須開啟。獲取存活設(shè)備IP列表。
- 利用paramiko庫模擬ssh去登錄個IP,如果登錄成功,返回設(shè)備名稱,并及將設(shè)備名稱和對應(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('掃描時間:'+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']#存活的主機數(shù)
returnlist(res['scan'].keys())#存活主機IP地址
if__name__=='__main__':
start=datetime.datetime.now()
user='user'
password='password'
hosts='10.0.0.0/24'
dev={}#存放AAA登錄成功的主機
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("程序運行時間:"+ 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))+'臺
')
f1.write('AAA登錄失敗'+str(login_failed_count)+'臺
')
f1.write("程序運行時間:"+str(end-start)+'
')
f1.close()
f2.close()
f3.close()
print("程序運行時間:"+str(end-start)+'
')
print("存活的IP地址有:"+str(len(ip_list))+"
")
print("AAA登錄成功:"+str(len(dev))+"
")
print('AAA登錄失敗'+str(login_failed_count)+'臺
')
這個小程序例子,只是一個大概思路。
可以添加或則改善的思路:
- 比想要獲取設(shè)備名,可以通過snmp,知道ip地址和snmp讀團體名就可以直接獲取。
- 可以將獲取到的數(shù)據(jù)存入數(shù)據(jù)庫中,從而可以做更的事情。
- 通過類似代碼,也可以實現(xiàn)每天去設(shè)備上備份網(wǎng)絡(luò)配置等功能。
- 可以將利用掃描結(jié)果,添加更多處理邏輯,生成每日巡檢日報,通過郵件或者短信發(fā)送。
nmap庫使用:
nmap工具使用可參考:nmap掃描工具學(xué)習(xí)筆記
如果在windows上寫nmap庫,有兩個事要解決。
第一步:安裝nmap軟件
因為在python程序中,nmap包所調(diào)用的是nmap可執(zhí)行程序,所以必須先安裝nmap軟件。nmap下載地址:https://nmap.org/download.html
第二步: 需要在nmap庫中文件的init方法中添加的nmap.exe的路徑。
不然會報錯,提示找不到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
審核編輯 :李倩
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9163瀏覽量
85429 -
網(wǎng)絡(luò)設(shè)備
+關(guān)注
關(guān)注
0文章
316瀏覽量
29650 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84692 -
小程序
+關(guān)注
關(guān)注
1文章
235瀏覽量
12136
原文標(biāo)題:網(wǎng)絡(luò)設(shè)備那么多,我用Python定時掃描網(wǎng)絡(luò)中的在線設(shè)備,每天發(fā)送AAA巡檢報告
文章出處:【微信號:網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號:網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論