0

我有以下 bash 命令,其中我正在执行 tcpdump,然后使用 date 命令保存文件。我想将此命令直接嵌入到我的 Python 脚本中,而不必单独调用 bash 脚本。

#!/bin/bash
timeout 2 tcpdump -i eth1 -s 96 -w /usr/src/pcapFiles/dump$(date +%y%m%d-%H%M%S).pcap

当我运行上面的脚本时,我得到了以下类型的文件名,这正是我所需要的(即日期和时间呈现在名称中):

dump131104-191834.pcap

但是,我很难从 Python 中复制上述命令。通过在 Python 中嵌入命令,我已经走到了这一步。我不确定如何破坏 date 命令,以便它可以像我需要的那样呈现文件名。以下是我的 Python 命令:

tcpd = subprocess.Popen(["timeout", "2", "tcpdump", "-i", "eth1", "-s", "96", "-w", "/usr/src/pcapFiles/dump$(date +%y%m%d-%H%M%S).pcap"], stdout=subprocess.PIPE)
output, err = tcpd.communicate()

使用此命令,我从 tcpdump 获得以下输出文件名

dump$(date +%y%m%d-%H%M%S).pcap

4

1 回答 1

5

$(..),又称命令扩展,由 shell 执行。由于您现在使用的是 Python 而不是 shell,因此您不能免费获得该功能。

简单的解决方法是调用一个 shell 并给它你的命令:

tcpd = subprocess.Popen(["bash", "-c", "timeout 2 tcpdump -i eth1 -s 96 -w /usr/src/pcapFiles/dump$(date +%y%m%d-%H%M%S).pcap"], stdout=subprocess.PIPE)
output, err = tcpd.communicate()

可以说更正确的解决方法是在 Python 中获取当前日期:

import datetime
filename=datetime.datetime.now().strftime("/usr/src/pcapFiles/dump%y%m%d-%H%M%S.pcap")
tcpd = subprocess.Popen(["timeout", "2", "tcpdump", "-i", "eth1", "-s", "96", "-w", filename, stdout=subprocess.PIPE)
output, err = tcpd.communicate()
于 2013-11-05T03:30:07.657 回答