你如何从字符串(Wireshark输出)中提取某些子串(IP地址)?

时间:2016-04-29 01:16:08

标签: python regex string wireshark

我正在逐行从文本文件中读取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

3 个答案:

答案 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组

Regex101 Demo

答案 1 :(得分:0)

首先看看正则表达式文档,对于python,它在这里:

https://docs.python.org/3/library/re.html

还有许多网站都有很好的教程,示例和交互式测试人员,例如:

http://regexr.com/

我不知道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()