用Python解决了一点实际问题 - 统计802.1x端口信息
前段时间公司推了802.1x,负责网络这一块的同事着实忙了一阵,现在路由器的设置基本上都搞定了,接下来的就是维护了。
昨天同事找到我,说有个事看看我能不能帮忙,现在整个亚太区百来台交换机,有时候要统计一下哪个端口因为接的是设备或者别的什么原因没有开802.1x,手动去看实在是太恐怖了,看一遍下来眼睛都要瞎了,让我看看能不能帮忙写个脚本做个统计什么的,每个交换机的配置都可以导出txt文件的,就是看一下端口有没有开802.1x,把没开的端口给记录下来,最好把那些没开的端口的描述也一起记录一下就最好了。
我当时心想的是思科应该有相关的show的筛选命令的吧。。。不过我考CCNA都过了五六年了,只记得show interface,这条路看来比较崎岖。
那么就分析文件吧,用什么呢,第一个想到的是用Python, 方便一点,反正都是内部用的,也不用多好看,能干活就行。
先定一下需求:
- 报告文件都是txt格式的,要先读取格式
- 配置是一行一行的存在报告文件里面的
- 每个端口都是用 xx/xx 这一行开头的
- 如果开启了802.1x,这个端口会有一行”authentication port-control auto”的配置
- 有的端口还有描述
需求就是找出没有”authentication port-control auto”的端口,把端口号读出来,再看看有没有描述,有的话也读出来,写到一个文本文件里面。
还蛮简单的。
读取文件的话用readlines()
readlines()能把每行存做一个字符串,再把这些字符串存进一个list里面。用起来就方便了
所以用
a2 = open('./Export/'+j)
line = a2.readlines()
就把文件读取并且一行一行存在了line这个list里面了。
然后把端口号给取出来。
用for循环一下就好了。
把每个端口在line里面的序号也存在一起,存在interface[]这个list里面:
n = 0
interface = []
for i in line:
if 'interface GigabitEthernet' in i:
interface.append(n)
n = n + 1
interface.append(len(line)-1)
然后就简单啦,对interface[]里面相邻的两个元素,根据它们的值在line[]里面查这之间的那几行里有没有””,没有的话就是没开802.1x, 根据前面那个行号,直接在line[]直接返回那一行,就是端口号了。
描述就更简单了,直接找一下,有就存一下,待会一起输出,没有就算了。
最后组合一下就好啦。
x = 0
y = len(interface)-1
t = 0
while x < y:
o = interface[x]
p = interface[x+1]
n = o
z = ''
while n < p:
if 'authentication port-control auto' in line[n]:
t = t + 1
if 'description' in line[n]:
z = line[n]
n = n + 1
if t == 0:
f = open('./list.txt', 'a') #a 为增量写文件
f.write(line[0][:-8]+' , '+line[o][-5:-1]+' , '+z[:-1]+'\n') # 去除字符串最后换行,最后手工添加换行
f.close()
t = 0
x = x +1
为了同事方便使用,还写了一个bat来打开这个py,这样就不用每次先进cmd打python了。
python count2.py
pause
这样就完成啦,同事只要装一个python 3.5,然后把报告都扔进Export文件夹,运行一下批处理就好了。
做完了再想想,其实这么简单件事,说不定直接用bat也能做,即使bat不行,excel+VBA肯定也可以,什么时候有空再研究一下吧。

