如何 运行 在 python 中作为子进程使用 2 个参数进行 tcpdump 以及如何获取其输出?

How to run tcpdump with 2 parameters in as subprocess in python and how to get its output?

我想 运行 tcpdump 参数:-n "(dst port 515 or dst port 9100)" -w capture.cap

当我尝试做的时候:

dump = subprocess.check_output(["tcpdump",'-n "(dst port 515 or dst port 9100)" -w capture.cap'])

我遇到异常:

subprocess.CalledProcessError: Command '['tcpdump', '-n "(dst port 515 or dst port 9100)" -w capture.cap']' returned non-zero exit status 1

使用 1 个参数即可。 另一个问题是如何获取此命令的输出,因为它似乎 运行 不停。

此代码不能正常工作:

p = subprocess.Popen(('sudo', 'tcpdump', '-l -n "(dst port 515 or dst port 9100)"'), stdout=subprocess.PIPE)
for row in iter(p.stdout.readline, b''):
print row.rstrip()   # process here

谢谢

你必须为每一项传递一个参数,并且没有引号:

subprocess.check_output(['tcpdump', '-n', '(dst port 515 or dst port 9100)', '-w', 'capture.cap'])

check_output() 不是 shell(除非你传递 shell=True,但在你的情况下这不是必需的):它不会为你拆分参数,并且赢了' 为您解释带引号的字符串。

请务必阅读 subprocess.run() 的文档并检查示例。

顺便说一下,除了 CalledProcessError 异常,你应该也收到了这个错误:

tcpdump: invalid option -- ' '

这是一个有用的提示:它在抱怨 -n 之后的 space。