【问题标题】:Python script iteration with different name output具有不同名称输出的 Python 脚本迭代
【发布时间】:2018-03-08 20:08:45
【问题描述】:

我正在尝试编写一个 Python 脚本来使用 Tshark 嗅探网络流量并保存到 .pcap 和 .csv 文件。

我一直手动运行tcpdump –W 5 –C 500 –w normaltraffic

捕获数据包并将No.、Time、Source、Destination、Protocol、Length、Info字段输出到 .csv 文件中。 -C 告诉 tcpdump 最多保存 5 个文件,用新文件覆盖最旧的文件,-W 规定最大文件大小为 500mb。

我更喜欢使用 Python 脚本和 Tshark 将相同的字段输出到 csv 文件,该文件每 5 分钟运行一次,并且每次都保存一个新文件。不再需要 5 次迭代限制和 500mb 大小。

要每 5 分钟迭代一次脚本,我想我可以编写一个 linux cron 作业,但是我如何更改以下内容以每次都输出到一个新文件(可能使用日期戳作为名称)。我想要的最终结果是每 5 分钟运行一次 Python 脚本,并将所有 .pcap 和 .csv 文件保存在一个文件夹中。

import os

os.system("tshark i 2 -T fields -e frame.time -e eth.src -e eth.dst -e ip.src -e ip.dst -e ip.proto -e tcp.len -e _ws.col.Info -w Data.pcap > Data.csv")

任何帮助将不胜感激!

@Barmar 你的意思是这样吗?

import os
from datetime import datetime


os.system("tshark i 2 -T fields -e frame.time -e eth.src -e eth.dst -e ip.src -e ip.dst -e ip.proto -e tcp.len -e _ws.col.Info -w Data.pcap > Data.csv")

sys.stdout = open(‘Data.csv’, 'w')

capture = datetime.now().strftime("%Y%m%d-%H%M%S")
sys.stdout = open(capture + ‘.csv’, 'w')

@mikael-rousson 会不会是这样的

import os
from datetime import datetime
from threading import Timer

sniff=threading.Timer(600, os.system("tshark i 2 -T fields -e frame.time -e eth.src -e eth.dst -e ip.src -e ip.dst -e ip.proto -e tcp.len -e _ws.col.Info -w Data.pcap > Data.csv"))  

while True:
    sniff.start()

    sys.stdout = open(‘Data.csv’, 'w')
    capture = datetime.now().strftime("%Y%m%d-%H%M%S")
    sys.stdout = open(capture + ‘.csv’, 'w')

【问题讨论】:

  • 在文件名中加上时间戳。您可以使用str.format() 方法将时间代入命令行。
  • @Barmar 我在描述中添加了另一个尝试 - 这是你的意思吗?对不起,编程新手
  • 这里真正想要完成什么?如果您每 5 分钟启动一次tshark,您最终会运行许多实例。你的停止条件是什么? 也许您想要做的是使用环形缓冲区,指定应该每 5 分钟创建一个新文件?关闭文件并启动新文件后,您需要将数据包数据从 pcap 文件导出到 csv,每个 csv 将有 5 分钟的数据。类似:tshark i 2 -b duration:300 -w Data.pcap(查看wireshark.org/docs/man-pages/tshark.html 了解更多信息。)
  • 您需要多解释一下您要做什么...您是否尝试多次午餐 tshark 并且基本上多次捕获相同的流量?或者可能有一只 tshark 每 5 分钟收集一次样本?样本是否小于 5 分钟,例如每 5 分钟收集 30 秒,或者您是否试图捕获所有内容(每 5 分钟收集 5 分钟?)
  • @ntg Christopher Maynard 我正在尝试创建一个 python 脚本,它将运行 tshark x 分钟,并将输出保存为 .pcap 文件和 .csv 文件。我希望使用日期和时间来命名输出文件。保存文件后,脚本应再次重复该过程,直到手动停止脚本。

标签: python wireshark


【解决方案1】:

一种选择是使用 Python 中 threading 模块中的 Timer。它可以在 n 秒后运行一个动作:threading.Timer(n, action)

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

对于您的任务,您可以使用这样的递归调用(注意最大递归限制 python):

import os
from datetime import datetime
from threading import Timer

def sniff(interval=600):
    os.system("tshark i 2 -T fields -e frame.time -e eth.src -e eth.dst -e ip.src -e ip.dst -e ip.proto -e tcp.len -e _ws.col.Info -w Data.pcap > Data_{}.csv".format(datetime.now()))
    Timer(interval, sniff).start()

sniff()

【讨论】:

  • 当我运行代码时,我收到一条错误消息“NameError: name threading is not defined”
  • 如果我在脚本顶部添加导入线程,我会得到一个不同的错误。 AttributeError:模块线程没有属性计时器
  • 你在使用 Python 3 吗?
  • Mikael - 越来越近了,谢谢。我在第 7 行 - Timer(iterval, sniff).start() 上收到错误提示语法无效。以为可能是第 5 行用两个 Ls 拼写的区间,但更正后,我仍然得到相同的错误
  • 好的,它可能是第 6 行缺少右括号。我在 Data_{}.csv" 之后添加了一个括号,它似乎可以运行,但现在我得到 AttributeError: 'int' object has no attribute '格式'
猜你喜欢
  • 2022-07-11
  • 1970-01-01
  • 2017-02-28
  • 2014-06-08
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多