wireshark抓包对应xml⽂件解析
最近在搭建内部平台的时候,需设计⼀个脚本,将pcap/pcapng⽂件转化成xml⽂件,并且需要从xml提取有效数据,将其插⼊Mongo数据库,实现语⾔为java,具体实现时引⼊了⼀些第三⽅库,最后⽣成⼀个auto.jar⽂件,因为jar⽂件可以很⽅便的被其他脚本直接调⽤,⽅便做⼀些⾃动化管理。
整个auto.jar的实现分为以下三部分:
1、 通过Process调⽤tshark命令,将pcap/pcapng⽂件转化成xml⽂件
2、 根据提取数据内容的BSON格式设计⽂档,从xml⽂件提取有效信息,并调⽤阿⾥的fastjson库(Java语⾔编写的JSON处理器)⽣成BSON格式信息
3、 通过Mongo3.1.jar库,将BSON信息插⼊数据库
下⾯对上述三个部分做⼀个简单的说明。
⼀、xml⽂件⽣成
⽰例程序如Example.java⽂件所⽰,通过Runtime()执⾏命令即可。该过程相对较简单,需
要注意的是,在Windows和linux 平台下,具体命令的表现形式会有所不同,如Window需要加上” /C”,linux需要加上”/bin/sh -c”。
⽣成xml⽂件通过tshark命令实现,tshark命令需注意版本,不同版本⽣成xml标签字段会有⼀些差别,⽐如版本1.6.*中UDP包可能就没有Stream index字段,⽽2.2.6版本则有上述字段。
public class Example {
public static void main(String args[]) {
try {
Runtime runtime = Runtime();
Process proc = ("tshark -r xxx.pcap -T pdml > l");
int exitVal = itValue();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
tshark命令详细信息链接
⼆、xml解析
xml解析需选择适当的xml解析库,xml解析库有很多,如SAXParser、dom4j等,思路通常分为两种,⼀种是⾸先读取所有的xml⽂件,然后通过标签节点提取信息,另⼀种是按⼀⾏标签⼀⾏标签读取,通过⼀些特定的接⼝逻辑,如public void startElement(...), public void endElement(...),实现上下⽂关联,因为解析xml的时候,有时需要解析完⼀个顶层标签才能获得想要的信息,⽽顶层标签可能⼜包含多⾏标签,所以需要做⼀些上下⽂关联管理。
前者适⽤于⽂件较⼩的xml⽂件,⼀般不要超过100M(与电脑硬件配置有关),这种⽅式可以从xml⽂件的全局出发去解析xml⽂件,相对⽐较直观;后者适⽤于⽂件较⼤的xml⽂件,如⼏GB~⼏⼗GB,甚⾄更⼤。
Demo0是使⽤dom4j的⼀个例⼦。
public class Demo0 {
public static void main(String[] args){
File xmlFile = new File("D:/s.xml");
FileInputStream fis = null;
try {
fis = new FileInputStream(xmlFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
SAXReader saxReader = new SAXReader();
List rowList = null;
try {
//⽣成⽂档对应实体
Document doc = ad(fis);
//获取指定路径下的元素列表,这⾥指获取所有的data下的row元素
rowList = doc.selectNodes("//data/row");
} catch (DocumentException e) {
e.printStackTrace();
}
for(Iterator iter = rowList.iterator();iter.hasNext();){
/
/获得具体的row元素
Element element = (();
//获得row元素的所有属性列表
List elementList = element.attributes();
for(Iterator iter1 = elementList.iterator();iter1.hasNext();){
//将每个属性转化为⼀个抽象属性,然后获取其名字和值
AbstractAttribute aa = (();
System.out.println("Name:"+aa.getName()+";Value:"+aa.getValue());
}
}
}
}
这种⽅式不适合处理⼤⽂件,我的电脑上跑⼤于等于800MB的xml⽂件就跑不动了(我的电脑内存为16GB)。 Demo1是SAXParser的⼀个例⼦。
public class Demo1 extends DefaultHandler {
// 执⾏到起始标签触发
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
for (int i = 0; i < Length(); i++) {
String value = Value(i);// 获取属性的value值
System.out.QName(i) + "-----" + value);
}
}
// 执⾏到标签尾触发
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
}
// 读完xml⽂件触发
@Override
public void endDocument() throws SAXException {
}
}
Demo1是⼀⾏⼀⾏标签读取,所有如果需要处理顶层标签,需要结合startElement(...)和endElement(..)接⼝,做⼀些应⽤管理。
由于xml提取出的信息⼤部分是⽂本信息,所以要提取具体内容的时候,会使⽤⼤量的正则匹配,如提取某个括号内的信息等,会⽤到⼀些⾼级的正则表达式,如前、后向索引等,正则相关内容就不详细讲了。
Xml⽂件提取后,通过对象进⾏管理,这⾥的对象⽐较⼴泛,⽐如TCP流管理对象、packet包管理对象、应⽤层协议(如http等)管理对象、BSON格式管理对象等,提取的信息最终都是为了满⾜BSON格式内容要求,因此对象需要做⼀些特殊的设计,⽐如对象可能会包含多层结构等。
使用dom4j解析xml文件提取的内容保存在某些对象⾥⾯,然后再调⽤阿⾥的fastjson jar()库,可以很⽅便的将对象转换成BSON格式。BSON格式对⼤⼩有要求,不能超过16MByte,否则数据库会返回异常。
三、BSON内容插⼊数据库
该过程简单,调⽤Mongo3.1.jar库⾥⾯的insert接⼝即可。
四、总结
整个开发过程是在eclipse上开发的,代码总的来说还是⽐较简单,代码测试完成后,export⽣成jar⽂件,jar⽂件根据输⼊的命令⾏参数做⼀些输⼊控制,如-r xxx.pcap,表⽰读取xxx.pcap⽂件,auto.jar⽂件会解析对应的xxx.pcap⽂件;之所以做⼀些命令⾏的处理,是后⾯需要将auto.jar作为⼀个命令脚本,供其他脚本调⽤,这样就可以⽅便的实现⾃动化处理流程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论