Любой способ оптимизировать / правильно уточнить этот сценарий <50 строк? - PullRequest
0 голосов
/ 27 июня 2011

Я все еще изучаю 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 ]

1 голос
/ 27 июня 2011

Вы можете зациклить файл как этот.Нет необходимости использовать 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'):
0 голосов
/ 27 июня 2011

Проверьте argparse для обработки аргументов.

Разделить на функции.

Используйте main конструкцию.

Посмотрите на модуль CSV. Вы можете установить разделитель на пробел.

Посмотрите еще раз на выражение. Вы можете сделать это с одним выражением re, где это 'или' из различных шаблонов.

0 голосов
/ 27 июня 2011
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:])
0 голосов
/ 27 июня 2011

Поскольку я, похоже, помню, что использование python для анализа выходных файлов nmap было одним из моих первых приложений на python, я могу сделать пару рекомендаций: 1) Если вы хотите изучить синтаксический анализ XML и python, рекомендуется использовать альтернативный формат XML nmap. Преимущество этого заключается в том, что вывод 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 #.
...