使用Regex的Python Parse文件

时间:2015-11-09 14:15:46

标签: python regex parsing nmap

我希望有人能够让我在这里走上正轨。我需要用Python解析nmap输出。我认为使用正则表达式将是正确的方法,但我从未使用正则表达式。以下是我需要解析的文本示例 - > http://pastebin.com/QhG86D7D

我需要对此文件执行的操作是:

  1. 我需要IP地址。
  2. 我需要开放端口。
  3. 诀窍是我需要显然将IP和端口捆绑在一起,因为我将它们导入到一个数据库中,该数据库将显示每个IP打开的端口。

    我也在想我应该将逻辑编写到函数中,这样我就可以用更多的主机来解析不同的文件。

    我知道如何将文件读入我的脚本并将数据放入我的数据库。我被困在哪里是用正则表达式来解析我需要的数据。有人可以帮助我吗?

    提前致谢!

2 个答案:

答案 0 :(得分:2)

以下方法可以帮助您入门:

import re

nmap = """Host: 127.0.0.1 ()      Status: Up
Host: 127.0.0.1 ()      Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 443/open/tcp//https///        Ignored State: closed (65532)
Host: 127.0.0.2 ()      Status: Up
Host: 127.0.0.2 ()      Ports: 21/open/tcp//ftp///, 22/open/tcp//ssh///, 25/open/tcp//smtp///, 53/filtered/tcp//domain///, 80/open/tcp//http///, 110/open/tcp//pop3///, 143/open/tcp//imap///, 443/open/tcp//https///, 465/filtered/tcp//smtps///, 993/open/tcp//imaps///, 995/open/tcp//pop3s///, 5222/filtered/tcp//xmpp-client///    Ignored State: closed (65523)
# Nmap done at Sat Nov  7 10:40:36 2015 -- 2 IP addresses (2 hosts up) scanned in 32.07 seconds"""

entries = []

for line in nmap.split('\n'):
    re_host = re.match(r'Host\: ([0-9.]+?)\s+', line)
    if re_host:
        host = re_host.group(1)
        ports = re.findall('(\d+)\/open', line)

        if len(ports):
            entries.append((host,  ports))

for host, ports in entries:
    print '{:16} {}'.format(host, ports)

这将显示以下输出:

127.0.0.1        ['22', '80', '443']
127.0.0.2        ['21', '22', '25', '80', '110', '143', '443', '993', '995']

您可能希望将split替换为文件中的读数。

答案 1 :(得分:0)

已经有一个用于解析Nmap扫描输出的Python模块。对于Python 3,有python-nmap。对于Python 2,Nmap附带了一个名为Ndiff的工具,它是一个功能齐全的Nmap输出解析器库,带有一个小驱动程序来生成差异。

这些模块都解析Nmap的XML输出(使用-oX选项生成)。这是最好的选择,因为普通(人类可读)输出可能会随版本而变化,并且Grepable输出(您的示例)已弃用,这意味着它无法长时间提供任何新Nmap版本的输出time:traceroute,NSE,端口状态原因,软件和操作系统版本的CPE等未表示。