我希望有人能够让我在这里走上正轨。我需要用Python解析nmap输出。我认为使用正则表达式将是正确的方法,但我从未使用正则表达式。以下是我需要解析的文本示例 - > http://pastebin.com/QhG86D7D
我需要对此文件执行的操作是:
诀窍是我需要显然将IP和端口捆绑在一起,因为我将它们导入到一个数据库中,该数据库将显示每个IP打开的端口。
我也在想我应该将逻辑编写到函数中,这样我就可以用更多的主机来解析不同的文件。
我知道如何将文件读入我的脚本并将数据放入我的数据库。我被困在哪里是用正则表达式来解析我需要的数据。有人可以帮助我吗?
提前致谢!
答案 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等未表示。