使用 python-nmap 进行端口扫描

  1. 利用 python-nmap模块进行端口扫描,简单的实现方式

  2. 实现了三种输入方式
    1)单个端口扫描,例如 python scanport.py -H host -P port
    2)多个端口扫描,例如 python scanport.py -H host -P port1,port2,…..
    3)连续端口扫描,例如 python scanport.py -H host -P start_port-end_port

《使用 python-nmap 进行端口扫描》

#coding:utf-8

import nmap
import optparse
import sys

class INFO:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    ARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'


def scanport(host, port):
    nm =nmap.PortScanner()
    try:
        result = nm.scan(host,port)
        state = result['scan'][host]['tcp'][int(port)]['state']# 多层字典嵌套取值
        if state =='open':
            print INFO.OKBLUE+'[*] '+host+ ' tcp/'+port+" "+state+INFO.ENDC
        else:
            print INFO.WARNING+'[*] '+host+ ' tcp/'+port+" "+state+INFO.ENDC
    except Exception,e:
        raise e


if __name__ == '__main__':
    parser = optparse.OptionParser("usage %prog -H <target host> -p <target port> or -p <start_port>-<end_port>")
    parser.add_option('-H', dest='Host', type='string', help='specify target host')
    parser.add_option('-P', dest='Port', type='string', help='specify target port[s] separated by "-"'or ",")
    (options, args) = parser.parse_args()

    if options.Host ==None or options.Port==None:
        print parser.usage
        sys.exit()

    host = options.Host
    ports = options.Port
    print host,ports
    
    #如果是连续的端口
    if '-' in ports:
        ports_list = ports.split('-')
        for p in range(int(ports_list[0]),int(ports_list[1])+1):
           scanport(host, str(p))
           
    #其他的情况
    else:
        ports_list = ports.split(',')
        for p in ports_list:
            scanport(host, p)

上面的代码有点复杂,改良之后的代码如下:
优化结构

import nmap,argparse, sys
class INFO:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    ARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'
    



def scan_port(host, port):
    nm = nmap.PortScanner()
    try:
        result= nm.scan(host,port)
        print result
        state = result['scan'][host]['tcp'][int(port)]['state']
        if state == 'open':
            print INFO.OKBLUE+'[*] '+host+ ' tcp/'+port+" "+state+INFO.ENDC
        else:
            print INFO.WARNING + '[*] ' + host + ' tcp/' + port + " " + state + INFO.ENDC
    except Exception,e:
        raise e

def get_args():
    parger = argparse.ArgumentParser(description='port scan script')
    parger.add_argument('-H', '--host', help='specify target host')
    parger.add_argument('-P', '--port', help='specify target port')
    args = parger.parse_args()
    print args
    if args.host == None:
        parger.error('host is required')
        sys.exit()
    if args.port == None:
        parger.error('host is required')
        sys.exit()
    else:
        return args

        
def main():
    args = get_args()
    if '-' in args.port:
        ports_list = args.port.split('-')
        for p in range(int(ports_list[0]),int(ports_list[1])+1):
            scan_port(args.host, str(p))
    else:
        ports_list = args.port.split(',')
        for p in ports_list:
            scan_port(args.host, p)  
    

if __name__ == '__main__':
    main()
           
    原文作者:wawor4827
    原文地址: https://segmentfault.com/a/1190000009382480
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞