在正常情况下,我可以在linux下发布tshark -E separator='@'
请参阅注释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
...
同样,我认为我会通过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
结果
[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
我是否使用以下任何一种方式分配sep
似乎无关紧要......
sep = '@'
sep = '\@'
sep = re.escape('@') # Desperation attempt ;-)
有人可以解释一下:
@
分隔。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 ~]$
注意B。使用os.system()
或os.popen()
的答案不是我想要的
答案 0 :(得分: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)
当你从命令行运行它时,Bash剥离了单引号,tshark没有看到它们。