如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线。所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器上做成定时任务,每天发送AAA巡检报告。

下面是我写的一个python练手小程序。用来扫描一个网段中的在线主机,并尝试AAA去登录。统计一个大网段内可以成功aaa登录的主机。
注意:
该程序只是测试小程序,还有些小bug需要解决。不是通用的程序。主要提供一个大致思路。
主要用到了python-nmap, paramiko库。
程序大概思路:
代码示例:
# -*- coding: utf-8 -*-
import nmap
import datetime
import paramiko
import re
def get_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)
except Exception as err:
return 0, str(err)
#get shell
ssh_shell = client.invoke_shell()
dev_name = ''
while True:
line = ssh_shell.recv(1024)
if line.endswith(b'>'):#华为 华三
dev_name = re.findall(r'<(.*)>', str(line))[0]
#dev_name = str(line)[3:-2]
break
if line.endswith(b'# ') | line.endswith(b'#'): #思科
dev_name = re.findall(r'[\\r\\n|\\r]+(.*)#', str(line))[0]
break
if line.endswith(b'> '):
if 'ConnetOS' in str(line):#分流器
dev_name =re.findall(r'[\\r\\n|\\r]+(.*)>', str(line))[0].strip()
if '@' in str(line): #junpier防火墙
dev_name =re.findall(r'@(.*)>', str(line))[0].strip()
break
#怎么跳出recv阻塞
ssh_shell.close()
return 1, dev_name
#print('扫描时间:'+res['nmap']['scanstats']['timestr']+'\n命令参数:'+res['nmap']['command_line'])
def get_ip_list(hosts):
nm = nmap.PortScanner()
#nmap填入参数列表可以填很多
res = nm.scan(hosts=hosts, arguments='-sn -PE')
#count = res['nmap']['scanstats']['uphosts'] #存活的主机数
return list(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)) + "\n")
#f.write("程序运行时间:" + str(end-start) + '\n')
for ip in ip_list:
f.write(ip + '\n')
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('\n')
for ip in ip_list:
ok, dev_name = get_name(ip, user, password)
if ok == 1:
if dev_name not in dev.keys():
vendor = ''
print(dev_name + "\t\t" + ip)
if 'h' in dev_name[-12:]:
vendor = 'h4c'
elif 'c' in dev_name[-12:]:
vendor = 'cisco'
elif 'w' in dev_name[-12:]:
vendor = 'huawei'
else:
vendor = 'unknow'
f1.write(dev_name + '\t\t' + ip + '\t' + vendor + '\n')
f1.flush()
dev.update({dev_name : ip})
else:
f3.write(dev_name + '\t\t' + str(dev[dev_name]) + ' ' + ip +'\n')
print(dev_name + '\t\t' + str(dev[dev_name]) + ' ' + ip +'\n')
dev.update({dev_name: [dev[dev_name] , ip]})
f3.flush()
else:
login_failed_count += 1
print(dev_name)
f2.write(dev_name + '\t\t' + ip + '\n')
f2.flush()
end = datetime.datetime.now()
f1.write('AAA登录成功' + str(len(dev)) +'台\n' )
f1.write('AAA登录失败' + str(login_failed_count) +'台\n' )
f1.write("程序运行时间:" + str(end-start) +'\n')
f1.close()
f2.close()
f3.close()
print("程序运行时间:" + str(end-start) +'\n')
print("存活的IP地址有:" + str(len(ip_list)) + "\n")
print("AAA登录成功:" + str(len(dev)) + "\n")
print('AAA登录失败' + str(login_failed_count) +'台\n')另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
Copyright © 2009-2022 www.fjjierui.cn 青羊区广皓图文设计工作室(个体工商户)达州站 版权所有 蜀ICP备19037934号