有什么方法可以优化/正确优化这个< 50行脚本?

时间:2011-06-27 01:07:30

标签: python optimization nmap

我还在学习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 个答案:

答案 0 :(得分: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'):

答案 1 :(得分:0)

因为我似乎记得使用python来解析nmap输出文件是我的第一个python应用程序之一,我可以提出一些建议: 1)如果您想学习XML解析和python,建议使用nmap的备用XML格式。这具有以下优点:与纯文本输出不同,XML输出不太像是以小的但是破坏脚本的方式改变。 (基本上,字符串字段上的匹配非常适合快速入侵,但几乎可以肯定会让你不知所措,因为我发现当nmap更新时它们稍微改变了我正在解析的列之一的格式...当我们升级其中一个Windows框并且操作系统或服务字段中的一些文本与我匹配的内容匹配时,我也觉得有点儿。如果你对这条路有兴趣,我可以看看我是否有我的nmap使用xpath的解析器

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 #.

答案 2 :(得分: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:])

答案 3 :(得分:0)

检查argparse以处理参数。

分成几部分。

使用构造。

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

再看看表达式。你可以用一个表达式来表达它,它是不同模式的'或'。