【Python】nmap掃描文件端口提取工具V3

用法參考
http://www.reibang.com/p/3e49ff2ffa24
我的github:
https://github.com/ucstone/codelib

#!/usr/bin/env python
# -*-encoding: utf-8 -*-
__author__ = 'M1k3'

import argparse
import sys
import os

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
reload(__import__('sys')).setdefaultencoding('utf-8')

# 提取nmap掃描結(jié)果文件
def deal_nmap_xml(xml_name, save_name):
    tree = ET.parse(xml_name)
    # res_file = open(save_name + '-all.txt', 'w') #生成過程文件
    root = tree.getroot()
    count = []  # 統(tǒng)計(jì)存活I(lǐng)P地址數(shù)量
    IP_ALL = []  # 開放端口總數(shù)
    IP = ''

    for child in root:
        if child.tag == 'host':  # 查找host標(biāo)簽
            for xx in child:
                for state in xx.iter('status'):
                    if state.attrib.get('state') == "up":  # 判斷主機(jī)是否存活
                        for ports in child:
                            for neighbor in ports.iter('address'):  # 提取主機(jī)IP地址
                                IP = neighbor.attrib['addr']
                                count.append(IP)
                            for port in ports:  # 端口信息 ports標(biāo)簽
                                for neighbor in port.iter('state'):
                                    # print neighbor.attrib['state']
                                    if neighbor.attrib['state'] == "open":  # 判斷端口是否開放
                                        if port.attrib.has_key('portid'):
                                            # print IP + ":" + port.attrib.get('portid')
                                            lll = IP + ":" + port.attrib.get('portid') + '\n'
                                            # res_file.write(lll)
                                            IP_ALL.append(lll)

    print "There are  %d surviving!" % len(count)
    print "Open port has: %d" % len(IP_ALL)
    # res_file.close()
    return IP_ALL


# 根據(jù)端口提取相應(yīng)的IP
def get_ip(ALL, ports):
    port_file = []
    for port in ports.split(','):
        for line in ALL:
            if len(line.split(':'))>2:
                print line.strip()+" Exception"
            if port == line.split(':')[1].strip():
                 # print line,
                 port_file.append(line)
    print "Port extraction is complete!"
    return port_file


# 比較新發(fā)現(xiàn)資產(chǎn)和合規(guī)平臺(tái)資產(chǎn)
def nmap_platform_cmp(file, pfile):
    f1 = file  # sys.argv[1]  # 新發(fā)現(xiàn)資產(chǎn)比對(duì)
    f2 = pfile  # sys.argv[2]  # 合規(guī)平臺(tái)資產(chǎn)導(dǎo)出的全部資產(chǎn)义钉,整理到一個(gè)txt文檔中

    os.chdir(f1)
    file_list = []

    if os.path.exists('res'):
        pass
    else:
        os.mkdir('res')

    for txt_file in os.listdir('.'):
        if txt_file.endswith('.txt'):
            file_list.append(txt_file)

    for txt_file in file_list:
        result = []
        if txt_file.endswith('.txt'):
            with open(txt_file, 'r') as xx_file:  # 打開新掃描的資產(chǎn)
                xx_ip = xx_file.readlines()
                print u"Before being removed", len(xx_ip)
                with open(f2, 'r') as yy_file:  # 打開合規(guī)平臺(tái)導(dǎo)出的資產(chǎn)
                    yy_ip = yy_file.readlines()
                    for xx in xx_ip:
                        if xx in yy_ip:  # 若新掃描的資產(chǎn)在合規(guī)平臺(tái)中,則說明已經(jīng)上報(bào)并剔除
                            result.append(xx)
                            xx_ip.remove(xx)  # 刪除已經(jīng)報(bào)備過的IP

                # print xx_ip
                print u"After removal", len(xx_ip)
                # 將新發(fā)現(xiàn)的資產(chǎn)提取出來
                with open(f1 + os.path.sep + 'res' + os.path.sep + txt_file.split('-')[0] + '-res.txt',
                          'w+') as zz_file:
                    for ip in xx_ip:
                        zz_file.writelines(ip)

        print u"Has been reported:%d" % len(result)
        with open(txt_file, 'r') as xx:
            # xx.readlines()
            print u"%s 未報(bào)備資產(chǎn) %s 個(gè)" % (txt_file, str(len(xx.readlines()) - len(result)))
        print 15 * '###'


if __name__ == '__main__':
    # 接受cmd參數(shù)
    parser = argparse.ArgumentParser()

    group1 = parser.add_argument_group(u'處理nmap掃描文件')
    group1.add_argument("-xpath", type=str, help=u"批量轉(zhuǎn)換,輸入nmap掃描結(jié)果xml文件所在的目錄")
    group1.add_argument("-xml", type=str, help=u"轉(zhuǎn)換單個(gè)xml文件,輸入nmap掃描結(jié)果xml文件")
    group1.add_argument("-port", type=str, default='21', help=u'要提取的端口;提取多個(gè)的格式為"21,80,445"')

    group2 = parser.add_argument_group(u'與合規(guī)平臺(tái)文件比對(duì)')
    group2.add_argument("-pfile", type=str, help=u"合規(guī)平臺(tái)已經(jīng)上報(bào)的資產(chǎn)")
    # parser.add_argument("-tfile", type=str, help=u'get ips or domains for this file')
    group2.add_argument("-tpath", type=str, help=u"新掃描的資產(chǎn)文件码耐,只接受目錄")
    args = parser.parse_args()

    # nmap掃描結(jié)果處理相關(guān)參數(shù)
    xml_path = args.xpath
    xml_file = args.xml
    ports = args.port
    # 合規(guī)平臺(tái)資產(chǎn)比較相關(guān)參數(shù)
    platform_file = args.pfile
    # txt_file = args.tfile
    txt_path = args.tpath

    if xml_file and ports:
        save_name = xml_file.split('.')[0]
        # print save_name
        print 'Began to extract %s open port IP' % xml_file
        IP_ALL = deal_nmap_xml(xml_file, save_name)
        get_ip(IP_ALL, ports)

    if xml_path and ports:
        os.chdir(xml_path)
        ALL = []
        for i in os.listdir(xml_path.strip()):
            if i.endswith('.xml'):
                xml_path_file = xml_path + os.path.sep + i
                save_name = i.split('.')[0]
                # print save_name
                print 'Began to extract %s open port IP' % i
                IP_ALL = deal_nmap_xml(xml_path_file, save_name)
                ALL = ALL+IP_ALL
        with open('port-res.txt','w+') as xx:
            for ip in get_ip(ALL, ports):
                xx.write(ip)
                # print ip,

    if txt_path and platform_file:
        try:
            if os.path.isfile(txt_path):
                print u"請(qǐng)輸入要處理文件的目錄"
            else:
                nmap_platform_cmp(txt_path, platform_file)
        except:
            print u"請(qǐng)輸入要處理文件所在目錄"
    else:
        pass
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谱净,隨后出現(xiàn)的幾起案子跪削,更是在濱河造成了極大的恐慌,老刑警劉巖屋休,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杂靶,死亡現(xiàn)場(chǎng)離奇詭異梆惯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吗垮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門垛吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抱既,你說我怎么就攤上這事职烧。” “怎么了防泵?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蚀之,是天一觀的道長。 經(jīng)常有香客問我捷泞,道長足删,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任锁右,我火速辦了婚禮失受,結(jié)果婚禮上讶泰,老公的妹妹穿的比我還像新娘。我一直安慰自己拂到,他們只是感情好痪署,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兄旬,像睡著了一般狼犯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上领铐,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天悯森,我揣著相機(jī)與錄音,去河邊找鬼绪撵。 笑死瓢姻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的音诈。 我是一名探鬼主播幻碱,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼改艇!你這毒婦竟也來了收班?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤谒兄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后承疲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸥咖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年燕鸽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啼辣。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啊研,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸥拧,到底是詐尸還是另有隱情党远,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布富弦,位于F島的核電站沟娱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腕柜。R本人自食惡果不足惜济似,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一矫废、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砰蠢,春花似錦蓖扑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柿赊,卻和暖如春俩功,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碰声。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工诡蜓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胰挑。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓蔓罚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞻颂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豺谈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 作為一個(gè)前端程序猿,下面這些站會(huì)讓你眼前一亮贡这。 amazeui框架組建豐富 http://amazeui.org...
    歐巴冰冰閱讀 8,846評(píng)論 18 303
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,171評(píng)論 25 707
  • 晚上陪孩子學(xué)習(xí)茬末,在旁邊的書店閑逛,兩個(gè)半小時(shí)盖矫,說長不長丽惭,倒也能看點(diǎn)喜歡的東西。于是我慢慢沿著分類書架尋找著自己想看...
    且癲狂且芬芳閱讀 305評(píng)論 2 0