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

时间:2016-03-21 09:37:15

标签: python subprocess tcpdump

我想运行tcpdump参数:-n“(dst port 515或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

由于

1 个答案:

答案 0 :(得分:1)

你必须为每个项目传递一个参数,而不是引号:

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之后抱怨空间。