如何使python在Linux上使用管道读取tcpdump捕获的.pcap数据?

时间:2019-04-22 02:03:23

标签: python linux tcp wireshark tcpdump

最近,我设法将Raspberry Pi 3B +板上的tcp数据捕获到本地计算机上的Wireshark进行实时处理,但是现在我想使用python实时捕获“ TCP”部分中的“数据”列并发送通过TCP端口将此列的数据发送到另一个监听端口1234的应用程序。

我认为我尝试了错误的方法。我的尝试如下所示:

下面的命令使wirehark可以实时分析另一台计算机的tcp流。

ssh root@10.0.1.2 tcpdump -ns 0 -i eth0 "not port 22" | wireshark -k -i -

它可以工作,wireshark可以实时工作。我想根据这些命令在每个数据包中转储并显示一些与我的终端要求相符的数据,因此,我尝试过滤所需的列,其起始地址为:

ssh root@10.0.1.2 tcpdump -ns 0 -i eth0 "not port 22" | python test.py

和文件test.py如下所示:

import sys
k = 0
try:
   for line in iter(sys.stdin.readline, b''):
      k = k + 1
      print(line)
except KeyboardInterrupt:
   sys.stdout.flush()
   pass
print(k)

但无法显示任何内容。

顺便说一下,tcp流是以二进制模式传输的。

我想通过tcpdump实时(或90%实时)捕获tcp数据中的某些指定数据,但是我尝试了一些方法,但不起作用。

我还尝试使用启用Wireshark的命令进行实时分析,然后将数据转发到python脚本,我在google中搜索了2天,结果匹配为零。<​​/ p>

如果有人能帮助我解决这个问题?我将非常感谢,谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个如何通过管道传递到python脚本的简单示例。

import sys
import fileinput


incoming = fileinput.input(sys.argv[1:])
for line in incoming:
    print line.rstrip()

python -u也可能

-u     Force  stdin,  stdout  and  stderr to be totally unbuffered.  On
              systems where it matters, also put stdin, stdout and  stderr  in
              binary  mode.   Note  that there is internal buffering in xread‐
              lines(), readlines() and file-object  iterators  ("for  line  in
              sys.stdin")  which  is  not  influenced by this option.  To work
              around this, you will want to use "sys.stdin.readline()"  inside
              a "while 1:" loop.