如何 运行 在 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。
我想 运行 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。