在进行scapy进行数据分析时,show()函数的输出为标准输出,不好再做后续处理,因此想在代码中实现将函数的标准输出重定向到文件中,再读取文件进行处理。
将一个可写对象(如file-like对象)赋给sys.stdout,可使随后的print语句输出至该对象。重定向结束后,应将sys.stdout恢复最初的缺省值,即标准输出。
sys.stdout重定向
简单示例如下:
import sys
savedStdout = sys.stdout #保存标准输出流
with open('out.txt', 'w+') as file:
sys.stdout = file #标准输出重定向至文件
print 'This message is for file!'
sys.stdout = savedStdout #恢复标准输出流
print 'This message is for screen!'
在我代码中需要实现的功能:
def dnsstr(filename):
rrname=[]
rdata=[]
'''
dnstr ="""
###[ DNS Resource Record ]###
rrname = 'hpd.baidu.com.'
type = CNAME
rclass = IN
ttl = 1564
rdlen = 18
rdata = 'hpd.a.shifen.com.'
###[ DNS Resource Record ]###
rrname = 'hpd.a.shifen.com.'
type = A
rclass = IN
ttl = 165
rdlen = 4
rdata = '180.101.212.33'
"""
#re_set = r'rrname = \'(.*?)\''
#result_rrname = re.findall(re_set, dnstr)
'''
with open(filename,'r') as file:
for r in file.readlines():
if "rrname" in r:
r = r.strip('\n ')
r = (str(r).split('=')[1])
r = r.strip(' ').strip('\'').strip('.')
#print(r)
rrname.append(r)
if "rdata" in r:
r = r.strip('\n ')
r = r.strip('\n ')
r = (str(r).split('=')[1])
r = r.strip(' ').strip('\'').strip('.')
rdata.append(r)
#print(rrname,rdata)
return rrname,rdata
def handlePkt_modify(pcapfile): try: pcap = scapy.all.rdpcap(pcapfile) except Exception as e: print(e) return dnsdic={} savedStdout = sys.stdout#保存标准输出流 with open('./file/dns.txt','w+') as file: for r in pcap: if r.getlayer('DNSRR'):
sys.stdout = file#标准输出流重定向到文件
r.getlayer('DNSRR').show() #print(dnstr.show()) sys.stdout = savedStdout#恢复标准输出流 rrname_list,rdata_list = dnsstr('./file/dns.txt') for i in range(len(rrname_list)): if dnsdic.get(rrname_list[i])!=None: if rdata_list[i] not in dnsdic[rrname_list[i]]: dnsdic[rrname_list[i]].append(rdata_list[i]) else: dnsdic[rrname_list[i]]=[] dnsdic[rrname_list[i]].append(rdata_list[i]) #print(dnsdic) return dnsdic
Python标准输出重定向:https://www.cnblogs.com/clover-toeic/p/5491073.html