python-nmap模块学习笔记

Nmap模块

安装准备:

  1. cmd模式下: pip install python-nmap

  2. 到官网下载nmap( http://www.nmap.com.cn/ )。

    安装在python的安装目录下。(C:\Users\username\AppData\Local\Programs\Python\Python36-32\Nmap )

  3. Porject interpreter中添加python-nmap模块

  4. 报错解决:

    >>> import nmap
    >>> s = nmap.PortScanner()
    Traceback (most recent call last):
    File "", line 1, in 
    AttributeError: module 'nmap' has no attribute 'PortScanner'
    

    解决方法:

    Make sure you get rid of the old nmap.pyc or cache file if that's there. 
    If that doesn't do it break out a debugger. 
    I have a good one called trepan2. 
    You should be able to step into the import statement. 
    – rocky
    
    删除编译器模块路径
    PyCharm Community Edition \porject\venv\Lib\site-packages\nmap\__pycache__
    文件夹下的两个.pyc文件
    然后重新启动PyCharm即可
    
    然后把
    PyCharm Community Edition \porject\venv\Lib\site-packages\nmap
    文件夹内容覆盖到
    C:\Users\user\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\nmap
    重新运行cmd即可
    

模块使用:

函数解析:

import nmap     #注意安装的是python-nmap模块,引用时是nmap

nm = nmap.PortScanner()     #实例化nmap.PortScanner()对象

nm.scan(hosts ='127.0.0.1',arguments ='-PS', ports='1-25')      #扫描
'''
参数解析:
1. hosts:扫描目标域名/IP地址。
2. argument: 扫描相关设置参数,详情可参考nmap中文手册(http://www.nmap.com.cn/doc/manual.shtm#2)。
3. ports: 扫描端口范围。
4. sudo: (暂时不明确)
'''

nm.command_line()       # 获取扫描所用的命令,例如: nmap -oX - -p 1-25 -PS 127.0.0.1

nm.scaninfo()       # 获取扫描的基本信息,例如: {'tcp': {'method': 'syn', 'services': '1-25'}}

nm.all_hosts()      # 获取所扫描的所有主机

nm['127.0.0.1'].hostname()      # 为主机127.0.0.1获取一个主机名,或者获取主机127.0.0.1的主机名
nm['127.0.0.1'].hostnames()         # 获取主机127.0.0.1的主机名列表作为字典列表

nm['127.0.0.1'].state()         # 获取主机状态(up|down|unknown|skipped) 

nm['127.0.0.1'].all_protocols()         # 获取所有在扫描中用到的协议

nm['127.0.0.1']['tcp'].keys()       # 获取所有tcp协议的端口,例如: dict_keys([1, 2, 3,......,25])

nm['127.0.0.1'].all_tcp()       # 获取所有tcp协议排序后的端口,例如:[1, 2, 3,......,25]
nm['127.0.0.1'].all_udp() 
nm['127.0.0.1'].all_ip() 
nm['127.0.0.1'].all_sctp()


###使用下列带端口号参数的函数时,请注意取值范围在扫描后所得的端口列表中,否则报错###
nm['127.0.0.1'].has_tcp(22)     # 127.0.0.1主机上是否有22/tcp端口的任何信息,例如:True

nm ['127.0.0.1'] ['tcp'] [22]         # 获取主机127.0.0.1上22/tcp端口的信息,
nm['127.0.0.1'].tcp(22)               # 例如: {'state': 'filtered', 'reason': 'no-response', 'name': 'ssh', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}

nm['127.0.0.1']['tcp'][22]['state']         # 获取127.0.0.1主机上22/tcp端口的状态,例如:filtered

后记

python-nma模块是一个集成度很高的模块,各个功能只要调用一个函数就能实现,所以实例部分就此省略,留给读者自己探索。

如果觉得nmap模块使用起来太过“傻瓜”,想尝试一下自己动手的话,可以尝试使用socket模块自行编写。