我正在逐行从文本文件中读取wireshark转储的内容。我可以轻松找到的一件事就是在wireshark输出的特定行中使用的协议(如下面的代码所示)。我遇到的问题是从线路中拔出ip addressess。正如您在下面的示例输出和我的代码中所看到的,拔出协议相当容易,因为它总是被资本化,并且它的两边都有一个空格。然而,IP地址不是那么统一,我也不太确定如何将它们拉出来。这主要是因为我不太确定re.match()
的所有部分是如何工作的。有人可以帮助我,并可能解释re.match()
参数如何工作?
file = open('tcpdump.txt', 'r');
for line in file:
matchObj = re.match(r'(.*) TCP (.*?) .*', line, re.M)
示例Wireshark输出:
604 1820.381625 10.200.59.77 -> 114.113.226.43 TCP 54 ssh > 47820 [FIN, ACK] Seq=1848 Ack=522 Win=16616 Len=0
答案 0 :(得分:1)
第一个正则表达式组是import com.ximpleware.*;
import java.io.*;
public class simpleMod {
public static void main(String s[]) throws VTDException,IOException{
VTDGen vg = new VTDGen();
if (!vg.parseFile("input.xml", false))
return;
VTDNav vn = vg.getNav();
XMLModifier xm = new XMLModifier(vn);
AutoPilot ap = new AutoPilot(vn),ap2=new AutoPilot(vn);
ap.selectXPath("/employees/employee[@ID='1']/Salary");
ap2.selectXPath("../../employee[@ID='2'");
int i=ap.evalXPath();
if (i==-1)
return;
xm.insertAfterElement("<Address>10th cross, Park Avenue</Address>");
i=ap2.evalXPath();
if (i==-1)
return;
xm.insertAfterElement(" <Employee ID=\"3\">\n<Firstname>Holly</Firstname>\n<Lastname>Becker</Lastname>\n<Age>24</Age>\n<Salary>30000</Salary>\n</Employee>");
xm.output("output.xml");
}
}
greedy
并匹配所有内容,您可以通过添加(.*)
来创建non-greedy
,即:
?
以上示例将分别捕获包含远程地址file = open('tcpdump.txt', 'r');
for line in file:
matchObj = re.match(r"->\s(.*?)\s(\w+)\s(.*?)\s", line, re.M)
,协议114.113.226.43
和端口TCP
的 3组。
答案 1 :(得分:0)
首先看看正则表达式文档,对于python,它在这里:
https://docs.python.org/3/library/re.html
还有许多网站都有很好的教程,示例和交互式测试人员,例如:
我不知道wireshark的输出格式,但我想它会在某处记录。
这应该得到你的IP地址:
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b
答案 2 :(得分:0)
由于人们已经做出回应,regex是可行的方法。用于此目的的示例代码
import unittest
import re
from collections import namedtuple
protocol = namedtuple('Protocol', ['source', 'destination', 'protocol'])
def parse_wireshark(input):
pat = re.findall(r"(\d+\.\d+\.\d+\.\d+) -> (\d+\.\d+\.\d+\.\d+) (\w+)", input)[0]
return protocol(source=pat[0], destination=pat[1], protocol=pat[2])
class TestWireShark(unittest.TestCase):
def test_sample(self):
self.assertEqual(parse_wireshark("604 1820.381625 10.200.59.77 -> 114.113.226.43 TCP 54 ssh > 47820 [FIN, ACK] Seq=1848 Ack=522 Win=16616 Len=0"),
protocol(source='10.200.59.77',
destination='114.113.226.43',
protocol='TCP'))
if __name__ == '__main__':
unittest.main()