2014-07-11 4 views
2

이 파일은 여러 줄로 구성되어 있으며 각 줄마다 일부 정보 만 가져오고 싶습니다. 전체 줄은 아닌데 여기에 파일의 모양이 나와 있습니다. 나는 이러한 요소를 추출 할 그것으로부터 있도록파일의 행을 일치시키고 파이썬에서 구문을 분석하십시오.

18:10:12.960404 IP 132.227.127.62.12017 > 134.157.0.129.53: 28192+ A? safebrowsing-cache.google.com. (47) 
18:10:12.961114 IP 134.157.0.129.53 > 132.227.127.62.12017: 28192 12/4/4 CNAME safebrowsing.cache.l.google.com., A 173.194.40.102, A 173.194.40.103, A 173.194.40.104, A 173.194.40.105, A 173.194.40.110, A 173.194.40.96, A 173.194.40.97, A 173.194.40.98, A 173.194.40.99, A 173.194.40.100, A 173.194.40.101 (394) 
18:13:46.206371 IP 132.227.127.62.49296 > 134.157.0.129.53: 47153+ PTR? b._dns-sd._udp.upmc.fr. (40) 
18:13:46.206871 IP 134.157.0.129.53 > 132.227.127.62.49296: 47153 NXDomain* 0/1/0 (101) 
18:28:57.253746 IP 132.227.127.62.54232 > 134.157.0.129.53: 52694+ TXT? time.apple.com. (32) 
18:28:57.254647 IP 134.157.0.129.53 > 132.227.127.62.54232: 52694 1/8/8 TXT "ntp minpoll 9 maxpoll 12 iburst" (381) 
....... 
....... 

그것은 실제로 DNS 요청의 출력 : [타임 스탬프], [srcip을], [SRC PRT], [DST의 IP], [DST의 PRT] , [도메인 (있는 경우)], [관련된 ips 주소]

웹 사이트의 오래된 항목을 살펴본 후 re.match()가 그렇게하는 데 도움이된다는 것을 알았지 만, 모든 라인은 d 다른의 ifferent, 나는 종류의 도움이 좋을 것, 손실하고, 여기에 내가 지금까지 쓴 코드이며 올바른 :

def extractDNS(filename): 
    objList = [] 
    obj = {} 

    with open(filename) as fi: 
     for line in fi: 
      line = line.lower().strip() 

      #18:09:29.960404 
      m = re.match("(\d+):(\d+):(\d+.\d+)",line) 
      if m: 
       obj = {}  #New object detected 
       hou = int(m.group(1)) 
       min = int(m.group(2)) 
       sec = float(m.group(3)) 
       obj["time"] = (hou*3600)+(min*60)+sec 
       objList.append(obj) 

      #IP 134.157.0.129.53 
      m=re.match("IP\s+(\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}).(\d+)",bb) 
      if m: 
       obj["dnssrcip"]  = m.group(1) 
       obj["dnssrcport"] = m.group(2) 

      # > 134.157.0.129.53:  
      m = re.match("\s+>\s+(\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}).(\d+):",line) 
      if m: 
       obj["dnsdstip"]  = m.group(1) 
       obj["dnsdstport"] = m.group(2) 


    tstFile3=open("outputFile","w+") 
    tstFile3.write("%s\n" %objList) 
    tstFile3.close() 

extractDNS(sys.argv[1]) 

는 내가 만드는 알고있는 경우이 후 다른 문 때문에 그 다음에 오는 것은 언제나 다르며, 3 가지 경우에 모든 DNS 출력 파일에 일반적으로 표시됩니다.
- A? CNAME, 정확한 도메인 및 IP 주소는 다음과 같습니다.
- PTR? NXDOmain이 뒤 따르는 것은 도메인이 존재하지 않는다는 의미이므로이 줄을 무시합니다.
- TXT? 뒤에 도메인이 있지만 단어 만 제공하므로이 두 단어는 무시합니다.

응답에 IP 주소가 포함되어 있기를 원합니다.이 경우에는 A?

답변

1

처음 5 개의 열이 항상 존재한다는 것을 알고 있다면, 그 열을 분리하고 직접 처리해야합니다 (타임 스탬프에 datetime을 사용하고 수동으로 IP 주소/포트를 구문 분석). 그런 다음 정규식을 사용하여 해당 필드에서 CNAME 레코드와 관심있는 내용 만 일치시킬 수 있습니다. 실제로 출력을 사용하지 않으려는 경우 정규 표현식을 다른 가능성에 대해 검사 할 필요가 없습니다. 따라서 CNAME 형식과 일치하지 않으면 처리 방법에 신경 쓰지 않아도됩니다. 적어도 그것은 그것이 들리는 것입니다.

+0

예! 고맙습니다! 그게 더 좋은 생각이 들리는데, 나는 이것을 처리하기 위해 많은 것들을 시도했다. 나는 지금 바보 같다고 생각한다. – Catty

+0

타임 스탬프에 관한 간단한 질문으로, 나는이 코드에서 전에 이것을 시도했다.'time.mktime (datetime.strptime (mu. "% H : % M : % S. % f"). timetuple())'
하지만 작동하지 않았습니다. 제게 시험해 주시겠습니까 – Catty

+0

datetime.datetime.strptime (" 18 : 10 : 12.960404 ","% H : % M : % S. % f ") timetuple() 나를위한 단어. 귀하의 그룹 (1)이 귀하가 생각하는 것과 약간 다른 것을 되돌려 줄 수 있습니까? – user632657

0

위에서 user632657이 말했듯이, 신경 쓰지 않아도되는 선에 대해 신경 쓰지 않아도됩니다. 그냥 그 라인에 대해 하나의 정규 표현식을 사용하고, 일치하지 않을 경우, 그 라인 무시 :에만 CNAME 레코드와 일치합니다

pattern = re.compile(r'(\d{2}):(\d{2}):(\d{2}\.\d+)\s+IP\s+(\d+\.\d+\.\d+\.\d+)\.(\d+)\s+>\s+(\d+\.\d+\.\d+\.\d+)\.(\d+):\s+(\d+).*?CNAME\s+([^,]+),\s+(.*?)\s+\(\d+\)')

합니다. 루프 밖에서 한 번만 정의하면됩니다. 그런 다음, 루프 내 :

try: 
    hour, minute, seconds, source_ip, source_port, dst_ip, dst_port, domain, records = pattern.match(line).groups() 
except: 
    continue 
records = [ r.split() for r in records.split(', ') ] 

이것은 당신이 관련 변수에 대해 질문 한 모든 필드를 당겨, 내가 될 것입니다 내기 쌍의 목록 (클래스, IP)에 관련 IP를 구문 분석 유용한 : P

관련 문제