Python Subprocess为我的shell参数添加了额外的引号

Mik*_*ton 3 python linux subprocess tcp wireshark

预期的行为

在正常情况下,我可以tshark -E separator='@'在linux 下发出注释A并强制它显示分隔的字段@,如下所示......

[mpenning@hotcoffee ~]$ tshark -r scp_test.pcap -e frame.number -e ip.src_host -e tcp.srcport -E separator='@' -T fields tcp | less
1@192.168.12.236@33088
2@192.168.12.238@22
3@192.168.12.236@33088
...
Run Code Online (Sandbox Code Playgroud)

意外行为

同样地,我认为我会subprocess.Popen()根据一些分析运行相同的命令,列化和着色......我的所有分析都取决于@运行脚本时输出的分离...但是,我的脚本没有使用@..相反,它使用单引号; 我不确定我理解为什么会这样.

脚本

import subprocess
import sys

filename = sys.argv[1].strip()
fields = ['frame_num', 'IP Src', 'TCP Src']
sep = '@'
cmd = r"""tshark -r %s -e frame.number -e ip.src_host -e tcp.srcport -E separator='%s' -T fields tcp""" % (filename, sep)

subcmd = cmd.split(' ')
lines = subprocess.Popen(subcmd, stdout = subprocess.PIPE)
for line in lines.communicate()[0].split('\n'):
    print line
Run Code Online (Sandbox Code Playgroud)

结果

[mpenning@hotcoffee ~]$ python analyze.py scp_test.pcap | less
1'192.168.12.236'33088
2'192.168.12.238'22
3'192.168.12.236'33088
4'192.168.12.238'22
5'192.168.12.236'33088
6'192.168.12.236'33088
7'192.168.12.238'22
8'192.168.12.236'33088
Run Code Online (Sandbox Code Playgroud)

似乎无论我是否sep使用以下任何一项进行分配......

  • sep = '@'
  • sep = '\@'
  • sep = re.escape('@') # Desperation attempt ;-)

有人能解释一下:

  1. 为什么我的输出没有@在上面的脚本中分开.
  2. 如何使用subprocess参见注释B来修复脚本?


最终注意事项

注A. 系统信息:

[mpenning@hotcoffee ~]$ python -V
Python 2.6.6
[mpenning@hotcoffee ~]$ uname -a
Linux hotcoffee 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64 GNU/Linux
[mpenning@hotcoffee ~]$
Run Code Online (Sandbox Code Playgroud)

注B.使用os.system()os.popen()不是我正在寻找的答案

jco*_*ctx 6

tshark的,走的是''%s'.不要使用单引号:

cmd = r"tshark -r %s -e frame.number -e ip.src_host -e tcp.srcport -E separator=%s -T fields tcp" % (filename, sep)
Run Code Online (Sandbox Code Playgroud)

当你从命令行运行它时,Bash剥离了单引号,tshark没有看到它们.