tshark管道输出导致数据包计数器

时间:2017-07-27 20:07:56

标签: tshark

当我尝试将tshark输出管道输出到任何东西时,我再也看不到流量了。 Tshark只显示一个包计数器。我该如何防止这种情况?

 sudo tshark -i enp60s0 -f "tcp" -T fields -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport -e tcp.checksum -e tcp.options -E header=y | column -t

2 个答案:

答案 0 :(得分:2)

上下文

对于上下文,这是您正在谈论的命令和输出:

$ sudo tshark -i enp60s0 -f "tcp" -T fields -e ip.src -e ip.dst -e tcp.srcport \
    -e tcp.dstport -e tcp.checksum -e tcp.options -E header=y | column -t
Capturing on 'Eth: enp60s0'
45

Tshark会将控制信息(例如捕获位置和数据包计数)发送到stderr而不是stdout。如果您不想看到此控制信息,请将stderr发送给dev null:

$ sudo tshark ... 2>/dev/null | column -t

方法

我们还可以每秒连续生成一个新捕获,然后可以使用tshark读取(有关完整详细信息,请参见tshark的manpage)。这类似于@ChristopherMaynard的解决方案,但是您无需等待捕获完成。用-w保存(-b duration:1)将每秒保存一次新的捕获:

#!/usr/bin/env bash
sudo tshark -w temp.pcap -b duration:1 2>/dev/null &

i=0
while true
  do if [ "$i" != "$(ls -1A . | wc -l)" ]; then 
    newfile="$(ls -t | head -n1)"
    sudo tshark -r "$newfile" 2>/dev/null | column -t
  fi  
  sleep 0.1 
done

验证

运行此命令,我们将得到如下输出。请注意,我们正在读取新的数据包捕获,因此tshark为其读取的每个新捕获添加从1开始的数字。

1   0.000000  192.168.2.1    →  192.168.2.242    DNS      134  Standard     query  response           0xfd75             No                            such                         name               PTR                                     1.2.168.192.in-addr.arpa      SOA                localhost               6c:96:cf:d8:7f:e7  ←  78:8a:20:d9:f9:11
2   0.000412  192.168.2.242  →  192.168.2.1      DNS      87   Standard     query  0x2a9b             PTR                249.249.16.104.in-addr.arpa   78:8a:20:0d:05:e7            ←                  6c:96:cf:d8:7f:e7
3   0.023726  192.168.2.1    →  192.168.2.242    DNS      149  Standard     query  response           0x2a9b             No                            such                         name               PTR                                     249.249.16.104.in-addr.arpa   SOA                cruz.ns.cloudflare.com  6c:96:cf:d8:7f:e7  ←  78:8a:20:d9:f9:11
4   0.024091  192.168.2.242  →  192.168.2.1      DNS      85   Standard     query  0x2f71             PTR                40.2.168.192.in-addr.arpa     78:8a:20:0d:05:e7            ←                  6c:96:cf:d8:7f:e7
1   1.026460  192.168.2.242  →  192.168.2.255    UDP      86   57621        →      57621              Len=44             ff:ff:ff:ff:ff:ff             ←                            6c:96:cf:d8:7f:e7
2   1.048071  192.168.2.1    →  192.168.2.242    DNS      135  Standard     query  response           0x2f71             No                            such                         name               PTR                                     40.2.168.192.in-addr.arpa     SOA                localhost               6c:96:cf:d8:7f:e7  ←  78:8a:20:d9:f9:11
3   1.048555  192.168.2.242  →  192.168.2.1      DNS      87   Standard     query  0xe77d             PTR                25.206.252.198.in-addr.arpa   78:8a:20:0d:05:e7            ←                  6c:96:cf:d8:7f:e7
4   1.125073  192.168.2.1    →  192.168.2.242    DNS      118  Standard     query  response           0xe77d             PTR                           25.206.252.198.in-addr.arpa  PTR                stackoverflow.com                       6c:96:cf:d8:7f:e7             ←                  78:8a:20:d9:f9:11

答案 1 :(得分:0)

column命令需要读取所有输入以确定每列的宽度,因此您无法在此上下文中使用column。 (您可以通过发出tshark命令然后在发布killall tshark的其他地方进行测试,然后您将看到所有输出。

相反,我认为您必须将输出重定向到文件,然后在完成tshark捕获会话后,如果需要,可以cat file | column -t。如果要在屏幕上查看输出并将其重定向到文件以供以后处理,可以将其传递给tee并向tee提供要写入的文件的名称。例如,tshark [options] | tee file,但您看到的输出格式很好,直到您稍后执行cat file | column -t