解析格式为ip:p的“masscan”工作的结果

2024-06-16 09:34:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始学习编程,我试图写一个简单的解析器,但我困惑。如果有人帮助我,我会很高兴的。在

在mres.txt文件在

# Masscan 1.0.3 scan initiated Sun Dec 23 23:00:31 2018
# Ports scanned: TCP(1;80-80) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 192.168.1.1 ()    Ports: 80/open/tcp////
Host: 192.168.1.1 ()    Ports: 801/open/tcp////
Host: 192.168.1.2 ()    Ports: 801/open/tcp////
Host: 192.168.1.2 ()    Ports: 445/open/tcp////
Host: 192.168.1.3 ()    Ports: 80/open/tcp////
Host: 192.168.1.3 ()    Ports: 8080/open/tcp////
Host: 192.168.1.3 ()    Ports: 21/open/tcp////
# Masscan done at Sun Dec 23 23:00:45 2018

我想以以下格式接收数据:

^{pr2}$

在脚本.py在

#!/usr/bin/env python
import sys, re, os

ports = []
ip = None

with open('mres.txt','r') as f:

for elem in f.readlines():

    if not elem.startswith('#'):
          if ip != None:
              if elem.split(' ')[1] == ip:
                  ports.append(elem.split(' ')[3].split('/')[0])
                  continue
              else:
                  print(ip + str(ports))
                  ports=[]
          else:
              #print('Unic: '+str(ip) + ' port: '+ str(elem.split(' ')[3].split('/')[0]))
              ip = elem.split(' ')[1]
              ports.append(elem.split(' ')[3].split('/')[0]) 

Tags: iptxthostifportsopendectcp
2条回答

最好使用dict来处理数据: 1) IP可以是Dict的密钥 2) List可以是Dict中的值

如果需要,我可以为您创建示例代码。在

这将处理数据,并打印所需的输出。我已经尽力在下面的评论中解释清楚了,但是如果有什么不清楚的地方,请提问。在

from collections import defaultdict
import socket

# build a dictionary of ip -> set of ports
# default dict is cool becasue if the key doesn't exist when accessed,
# it will create it with a default value (in this case a set)
# I'm using a set because I don't want to add the same port twice
ip_to_ports = defaultdict(set)

with open('mres.txt') as fp:
    for line in fp:
        # grab only the lines we're interested in
        if line.startswith('Host:'):
            parts = line.strip().split()
            ip = parts[1]
            port = parts[-1]
            # split it by '/' and grab the first element
            port = port.split('/')[0]

            # add ip and ports to our defaultdict
            # if the ip isn't in the defaultdict, it will be created with
            # an empty set, that we can add the port to.
            # if we run into the same port twice, 
            # the second entry will be ignored.
            ip_to_ports[ip].add(port)

# sort the keys in ip_to_ports by increasing address
for ip in sorted(ip_to_ports, key=socket.inet_aton):
    # sort the ports too
    ports = sorted(ip_to_ports[ip])
    # create a string and print
    ports = ', '.join(ports)
    print(ip, ports)

相关问题 更多 >