Python 使用正则表达式解析文件

Python Parse file with Regex

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

我需要对这个文件做的是:

  1. 我需要 IP 地址。
  2. 我需要开放的端口。

诀窍是我显然需要将 IP 和端口绑定在一起,因为我会将它们导入数据库,该数据库将显示为每个 IP 打开的端口。

我也在想我应该把逻辑写成一个函数,这样我就可以解析具有更多主机的不同文件。

我知道如何将文件读入我的脚本并将数据放入我的数据库。我卡住的地方是使用正则表达式来解析我需要的数据。有人可以帮我吗?

提前致谢!

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

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 替换为从您的文件中读取。

已经有一个 Python 模块用于解析 Nmap 扫描输出。对于 Python 3,有 python-nmap. For Python 2, Nmap ships with a tool called Ndiff,它是一个功能齐全的 Nmap 输出解析器库,带有一个用于生成差异的小型驱动程序。

这些模块都解析 Nmap 的 XML 输出(使用 -oX 选项生成)。这是最好的选择,因为正常的(人类可读的)输出会随着版本的不同而变化,并且 Grepable 输出(您的示例)已被弃用,这意味着它已经很长时间没有提供任何新 Nmap 版本的输出: traceroute、NSE、端口状态原因、CPE 软件和 OS 版本等未表示。