0

私はまだ python を学んでいます。私が飛び込むことに決めた最初のプロジェクトの 1 つは、大きな nmap ログを整理し、開いているポートを取り出し、それらを 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

引数の処理については、argparse を確認してください。

関数に分割します。

mainコンストラクトを使用します。

csv モジュールを見てください。区切り文字をスペースに設定できます。

re 式をもう一度見てください。異なるパターンの 'or' である 1 つの re 式でそれを行うことができます。

于 2011-06-27T08:09:38.747 に答える
0

Python を使用して nmap 出力ファイルを解析することは、私の最初の Python アプリケーションの 1 つであったことを覚えているようです。助言されます。これには、プレーン テキスト出力とは異なり、XML 出力が小さいがスクリプトを壊すような方法で変更されることが少ないという利点があります。(基本的に、文字列フィールドでのマッチングは素早いハックには最適ですが、nmap が更新され、解析していた列の 1 つの形式がわずかに変更されたときにわかったので、ほぼ間違いなく噛み付きます...また、Windows ボックスの 1 つをアップグレードし、OS またはサービス フィールドのテキストの一部が、私が一致させていたものと一致したときに、ちょっとしたことをしたと思います。

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 に答える