在正常情况下,我可以在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()
,columnify,并着色基于一些分析…所有我的分析依赖于输出被分隔@
当我运行脚本…但是,我的脚本不使用@
…,而是使用单引号; 我不确定我明白为什么会发生这种情况。
脚本
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()
答案不是我正在寻找的
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没有看到它们。