nmap模块实现端口扫描器(2)

mutinmscan.py 端口扫描的多进程版本,比照单线程版本最大的一个变化是nmscan函数的实现上,单线程传递一个服务器列表,在函数内部循环该列表,读取扫描结果,生成报告邮件。mutinmscan版的函数是接受一个ip地址,循环这一部分使用了mutiprocess库的Pool,并使用其map函数实现对服务器ip列表的迭代。多线程,一节更比五节强……

#!/usr/bin/python
#-*- coding:utf-8 -*-
 
import nmap
import re
import mytools as tool
import sys
from multiprocessing import Pool
from functools import partial
 
reload(sys)
sys.setdefaultencoding('utf8')
 
def nmScan(host,portrange,whitelist):
        p = re.compile("^(\d*)\-(\d*)$")
        # if type(hostlist) != list:
        #    help()
        portmatch = re.match(p,portrange)
        if not portmatch:
            help()
 
        if host == '121.42.32.172':
            whitelist = [25,]
        result = ''
        nm = nmap.PortScanner()
        tmp = nm.scan(host,portrange)
        result = result + "<h2>ip地址:%s 主机名:[%s]  ......  %s</h2><hr>" %(host,tmp['scan'][host]['hostname'],tmp['scan'][host]['status']['state'])
        try:
            ports = tmp['scan'][host]['tcp'].keys()
            for port in ports:
                info = ''
                if port not in whitelist:
                  info = '<strong><font color=red>Alert:非预期端口</font><strong>&nbsp;&nbsp;'
                else:
                  info = '<strong><font color=green>Info:正常开放端口</font><strong>&nbsp;&nbsp;'
                portinfo = "%s <strong>port</strong> : %s &nbsp;&nbsp;<strong>state</strong> : %s &nbsp;&nbsp;<strong>product<strong/> : %s <br>" %(info,port,tmp['scan'][host]['tcp'][port]['state'],                                                                      tmp['scan'][host]['tcp'][port]['product'])
                result = result + portinfo
        except KeyError,e:
            if whitelist:
                whitestr = ','.join(whitelist)
                result = result + "未扫到开放端口!请检查%s端口对应的服务状态" %whitestr               
            else:
                result = result + "扫描结果正常,无暴漏端口"         
        return result
 
def help():
        print "Usage: nmScan(['127.0.0.1',],'0-65535')"
        return None
 
if __name__ == "__main__":   
    hostlist = ['10.10.10.1','10.10.10.2']
    pool = Pool(5)
    nmargu = partial(nmScan,portrange='0-65535',whitelist=[])
    results = pool.map(nmargu,hostlist)
    #send email
    sender = 'linuxidc@163.com'
    receiver = ['linuxidc@qq.com',]
    subject = '服务器端口扫描'
    smtpserver = 'smtp.exmail.qq.com'
    smtpuser = 'linuxidc@163.com'
    smtppass = 'linuxidc163'
    mailcontent = '<br>'.join(results)
    tool.sendemail(sender,receiver,subject,mailcontent,smtpserver,smtpuser,smtppass)

扫描结果:马赛克阻碍了人类文明的进���,尤其是在欣赏岛国动作片的时候,但是,亲,我不能把俺们的服务器给你看的,你懂的!

Python 使用python-nmap模块实现端口扫描器

--------------------------------------分割线 --------------------------------------

Python 用socket模块实现检测端口和检测web服务 

CentOS上源码安装Python3.4 

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]

Python脚本获取Linux系统信息

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/faf5749f6e3f9c3fc2d6df2b573235d9.html