作为一个运维人员,内部有大量的主机,如何发现哪些主机是存活的,最好的工具还是nmap,但是nmap输出的数据太多,如何过滤自己需要的数据。本来主要介绍利用Python脚本 过滤nmap 输出结果,存入csv文件中。
0x00 nmap 扫描命令
- 参考资料
(1)nmap中文手册
(2)NMAP 输出XML文件详解
- nmap ping探测扫描,以xml格式输出结果
nmap -sP -ox nping.xml 192.168.2.0/24
ping 模式扫描192.168.2.0/24 网段,并以xml格式输出结果,输出结果文件为nping.xml
nmap -sP -iL test.txt -oX ceshi.xml XML输出
ping 模式扫描test.txt 文件中的地址,并以xml格式输出结果,输出结果文件为nping.xml
0x01 Python代码解析xml文件,存入csv文件
此脚本未写异常处理,如需要处理请自行编写
#coding:utf-8
import csv
from xml.etree import ElementTree as et
# version Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
def Get_ip(f_xml): #清洗xml数据
file_xml=f_xml #XML文件名
sum=[] #返回结果列表变量
data=open(file_xml).read()
root=et.fromstring(data)
t1= root.findall("host")
for t2 in t1:
#s2=[] # s2[0] save hosts ip address, s2[1] save hosts status
s2={"ip":"null","status":"null"} #存放主机IP地址和状态
for t3 in t2:
if(t3.tag=="status"):
#s2.append(t3.attrib["state"]) # Get hosts status
s2["status"]=t3.attrib["state"] #存放主机状态
elif(t3.tag=="address"):
if(t3.attrib["addrtype"]=="ipv4"):
#s2.append(t3.attrib["addr"])
s2["ip"]=t3.attrib["addr"] #存放主机IP地址
#sum.append(s2[::-1]) # Get hosts IP address,s2[::-1]:Reverse s2
sum.append(s2) #将字典s2存入列表sum变量中
return sum
def Write_csv(f_csv,datas): #写入csv文件中
file_csv=f_csv #csv文件名
datas=datas #需要写入文件的数据
headers=["ip","status"]
f=open(file_csv,"wb")
writer = csv.DictWriter(f,fieldnames=headers)
writer.writerows(datas)
f.close()
if __name__ == '__main__':
file_xml="nping.xml" #需要清洗的xml文件
file_csv="test.csv" #需要保存到的csv文件
s1=Get_ip(file_xml)
Write_csv(file_csv,s1)
0x02 格式化数据
- Get_ip方法,清洗后格式
[{'status': 'up', 'ip': '192.168.2.1'}, {'status': 'up', 'ip': '192.168.2.2'}]
-
Write_csv方法,存入csv格式为
图片.png
0x03 其他方法实现
其实Python 有一个python-nmap包可以直接调用nmap,可以参考
https://thief.one/2017/05/02/1/
https://pypi.org/project/python-nmap/
https://xael.org/pages/python-nmap-en.html