0

我仍在学习 python,我决定深入研究的第一个项目是对大型 nmap 日志进行排序,提取 OPEN 端口,并将它们转储到 IP:Port 格式的单独文本文件中。它有效,但是有更好的方法来写这个吗?这就是我最终得到的结果:

import sys
import string

"""
Written 6/24/2011 to pull out OPEN ports of an nmap proxy scan
Command:
nmap 218.9-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog3.txt
"""
if len(sys.argv) != 3:
    print 'Usage: python proxy.py <input file> <output file>'
    print 'nmap 218.1-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog.txt'
    print 'Example: python ./proxy.py PLog.txt proxies.txt'
    sys.exit(1)

r = open(sys.argv[1], 'r')
o = open(sys.argv[2], 'w')

pat80 = '80/open/'
pat8080 = '8080/open'
pat3128 = '3128/open'

for curline in r.xreadlines():
    sift = string.split(curline, ' ')
    ip = sift[1]

if curline.find(pat3128) >= 0:
    curport = '3128'

elif curline.find(pat8080) >= 0:
    curport = '8080'

elif curline.find(pat80) >= 0:
    curport = '80'

else:
    curport = '100'
    pass


if (curport == '3128') or (curport == '8080') or (curport == '80'):
    o.write(ip + ':' + curport + '\n')
    print ip + ':' + curport

else:
    pass
4

4 回答 4

1

您可以像这样遍历文件。没有必要使用xreadlines(). with确保文件在r超出范围时关闭

with open(sys.argv[1], 'r') as r:
    for curline in r:
        sift = string.split(curline, ' ')
        ip = sift[1]

    ...

在元组中查找比链更整洁or

if curport in ('3128', '8080', '80'):
于 2011-06-27T01:22:25.997 回答
0

因为我似乎记得使用 python 解析 nmap 输出文件是我的第一个 python 应用程序之一,所以我可以提出几个建议:1) 如果你想学习 XML 解析和 python,使用 nmap 的备用 XML 格式会被告知。这样做的好处是,与纯文本输出不同,XML 输出不太喜欢以小但脚本破坏的方式进行更改。(基本上,字符串字段的匹配非常适合快速破解,但几乎可以保证在路上咬你一口,因为我发现当 nmap 更新时,它们稍微改变了我正在解析的列之一的格式......还认为当我们升级其中一个 Windows 框并且操作系统或服务字段中的一些文本与我正在匹配的内容匹配时我得到了一点。如果你有兴趣沿着这条路走下去,

2)如果您想坚持使用文本输出和正则表达式,我建议您学习分组。具体来说,您可以定义一个组并检查它,而不是为每个端口创建自定义模式。

import re
r = re.compile("(/d+)/open") # match one or more digits followed by /open
mm = r.match(line) #mm will either be None or a match result object, if mm is not None, you can do mm.groups()[0] to get the port #.
于 2011-06-27T01:19:06.147 回答
0
import sys
import string

"""
Written 6/24/2011 to pull out OPEN ports of an nmap proxy scan
Command:
nmap 218.9-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog3.txt
"""

def get_port(line):
    port_mapping = {
        '80/open/': '80', # Is the backslash special here?
        # If they're really all supposed to have the same form,
        # then we can simplify more.
        '8080/open': '8080',
        '3128/open': '3128'
    }
    for pattern, port in port_mapping:
        if pattern in line: return port
    return None # this would be implied otherwise,
    # but "explicit is better than implicit"
    # and this function intends to return a value.


def main(in_name, out_name):
    with file(in_name, 'r') as in_file:
        ips = (get_port(line.split(' ')[1]) for line in in_file)
        with file(out_name, 'w') as out_file:
            for ip in ips:
                if ip == None: continue
                output = '%s:%s' % (ip, curport)
                out_file.write(output + '\n')
                print output


def usage():
    print 'Usage: python proxy.py <input file> <output file>'
    print 'nmap 218.1-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog.txt'
    print 'Example: python ./proxy.py PLog.txt proxies.txt'


if __name__ == '__main__':
    if len(sys.argv) != 3: usage()
    else: main(*sys.argv[1:])
于 2011-06-27T01:26:16.057 回答
0

查看 argparse 以处理参数。

拆分为功能。

使用构造。

查看 csv 模块。您可以将分隔符设置为空格。

再看一下 re 表达式。您可以使用一个 re 表达式来做到这一点,它是不同模式的“或”。

于 2011-06-27T08:09:38.747 回答