在Python中放置嵌套的bash命令

Zah*_*tar 0 python bash date

我有以下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
Run Code Online (Sandbox Code Playgroud)

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

dump131104-191834.pcap

但是,我很难从Python中复制上面的命令.我已经把这个命令嵌入到Python中了.我不确定如何破坏日期命令,以便它可以像我需要的那样呈现文件名.以下是我的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()
Run Code Online (Sandbox Code Playgroud)

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

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

tha*_*guy 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()
Run Code Online (Sandbox Code Playgroud)

可以说更正确的解决方法是在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()
Run Code Online (Sandbox Code Playgroud)

  • 你*可以*那样做,或者你可以使用`datetime`来获取当前时间:`datetime.datetime.now().strftime('%y%m%d-%H%M%S')`然后替代通过正常的字符串替换. (2认同)