python-nmap的函数学习
简介
python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。
可以看到python-nmap只有四个py文件(__init__.py, nmap.py, test.py, test_nmap.py),下面就一一进行解读
__init__.py
除去几十行的注释外,真正的代码只有四行,基本内容就是从同目录的nmap.py下导入一些基本信息:作者(__author__),版本(__version__),最后修改日期(__last_modification__),这些在nmap.py下都有写
test.py
test.py也只有简单的几行,运行时就是打印出本地的Host,猜测是用来测试是否可以利用nmap的扫描功能
nmap.py
nmap.py用于调用nmap的功能进行扫描,主要的扫描函数为PortScanner(object):
class PortScanner(object):
PortScanner类的英文注释就写着功能:PortScanner class allows to use nmap from python(PortScanner类允许在python使用nmap)
- def __init__(self, nmap_search_path=('nmap', '/usr/bin/nmap', '/usr/local/bin/nmap', '/sw/bin/nmap', '/opt/local/bin/nmap')):
主要功能就是在nmap_search_path查找nmap的路径(从nmap_search_path可以看出在Windows下使用得自己添加路径)和初始化PortScanner模块,包括本机上nmap的路径(self._nmap_path),扫描的结果(self._scan_result),nmap的主版本(self._nmap_version_number), nmap的子版本(self._nmap_subversion_number), nmap输出的版本信息(self._nmap_last_output),是否找到nmap(is_nmap_found)
- def get_nmap_last_output(self):
返回文本输出,可能用于调试,这里有作者的英文注释
- def nmap_version(self):
如果检查到nmap返回nmap的版本信息
- def listscan(self, hosts='127.0.0.1'):
不进行扫描,但解析目标主机并返回一个主机列表
- def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False):
调用nmap的扫描功能进行扫描,以json格式输出
- def analyse_nmap_xml_scan(self, nmap_xml_output=None, nmap_err='', nmap_err_keep_trace='', nmap_warn_keep_trace=''):
对nmap的扫描结果进行处理,扫描结果是XML形式,转化为json形式打印出来
- def __getitem__(self, host):
返回目标ip
- def all_hosts(self):
以列表形式返回目标ip
- def command_line(self):
返回输入的命令行
- def scaninfo(self):
以结构体形式返回扫描信息
- def scanstats(self):
以结构体形式返回扫描状态
- def has_host(self, host):
如果目标主机有回应就返回True(检查是否有目标主机)
- def csv(self):
把csv输出转化为文本返回
def __scan_progressive__(self, hosts, ports, arguments, callback, sudo):
用于PortScannerAsync的回调
class PortScannerAsync(object):
允许异步使用python中的nmap,每个主机的扫描结果都会通过回调返回,进行多线程扫描
- def __init__(self):
调用PortScanner()检查nmap所在的系统和和nmap版本
- def __del__(self):
用于对self._process清零,self._process用来存放扫描信息
- def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', callback=None, sudo=False):
调用多线程扫描,并且结果通过回调函数返回
- def stop(self):
停止当前的扫描过程
- def wait(self, timeout=None):
等待当前扫描进程的结束和超时
- def still_scanning(self):
检查当前进程是否还在扫描
class PortScannerYield(PortScannerAsync):
针对主机的扫描结果调用Yield进行处理
- def __init__(self):
调用PortScanner()检查nmap所在的系统和和nmap版本
- def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False):
把扫描结果放到迭代器里进行回调
class PortScannerHostDict(dict):
PortScannerHostDict:用于存储和访问主机扫描结果的字典类
- def hostnames(self):
以列表形式返回主机名
- def hostname(self):
返回第一个主机名,为了兼容性问题,不甚理解
- def state(self):
- def uptime(self):
两个都是返回主机的状态信息
- def all_protocols(self):
all_protocols:以列表形式返回扫描的协议
- def all_tcp(self):
- def has_tcp(self, port):
- def tcp(self, port):
三个函数的作用就是列出扫描到的TCP端口的信息
- def all_udp(self):
- def has_udp(self, port):
- def udp(self, port):
三个函数的作用就是列出扫描到的UDP端口的信息
- def all_ip(self):
- def has_ip(self, port):
- def ip(self, port):
三个函数的作用就是列出扫描到的IP端口的信息
- def all_sctp(self):
- def has_sctp(self, port):
- def sctp(self, port):
三个函数的作用就是列出扫描到的SCTP端口的信息
class PortScannerError(Exception):
为PortScanner检测异常的类
返回异常信息
def __get_last_online_version():
通过查询官网获得最新的python-nmap的版本信息,如0.6.1
def convert_nmap_output_to_encoding(value, code="ascii"):
对Unicode编码的scan_result对象进行编码的转换,作为字典返回
test_nmap.py
test_nmap.py是用来对python-nmap进行测试和对nmap是否正常运行的检查,无论是pdb库还是nose测试框架都经常用于python的测试和调试
class Pdb(Plugin):
提供调试选项,如果在程序测试时遇到错误或故障会放到pdb里进行调试
- def options(self, parser, env):
定义命令行选项:包括--pdb, --pdb-failures, --pdb-errors
- def configure(self, options, conf):
通过检查异常来匹配哪一个类型的异常触发插件
- def addError(self, test, err):
如果配置调试结果是调试错误把错误放入pdb
- def addFailure(self, test, err):
如果配置调试结果是调试失败把错误放入pdb
- def debug(self, err):
不甚理解,猜测是输出错误信息
- def setup_module():
设置扫描模块进行扫描
- def test_wrong_args():
测试输入的错误参数
- def test_host_scan_error():
测试主机扫描的错误
- def xmlfile_read_setup():
测试是否能读取xml文件
- def test_command_line():
测试输入命令行的命令是否合法
- def test_scan_info():
测试扫描信息是否存在
- def test_all_hosts():
- def test_host():
- def test_host_no_hostname():
- def test_port():
45.33.32.156是nmap的官网里的一个机器人,用来测试nmap是否能正确的运行
- def test_listscan():
测试列表扫描主机的结果
- def test_csv_output():
测试输出格式是否为CSV
- def test_listscan():
测试列表扫描
- def test_ipv6():
测试对IPV6的扫描
- def test_ipv4_async():
测试IPV4的异步扫描
- def test_ipv6_async():
测试IPV6的异步扫描
- def scan_localhost_sudo_arg_O():
扫描本地主机用户的信息
- def test_sudo():
测试主机信息
- def test_parsing_osmap_osclass_and_others():
测试是否获得主机的信息
- def test_all_protocols():
测试本地主机的信息
- def xmlfile_read_setup_multiple_osmatch():
读取osmatch_output.xml文件,设置osmatch的xml格式输出
- def test_multipe_osmatch():
检查主机的osmatch里是否存在一些信息
- def test_convert_nmap_output_to_encoding():
测试是否对nmap扫描结果进行了编码
- def test_WARNING_case_sensitive():
测试warning的警告信息是否存在
- def test_scan_progressive():
测试异步扫描的情况
总结
总的来说,就是写一个python脚本来调用nmap工具里的功能,不过里面的思路还是值得我们去了解和学习的,可能分析的内容不是很全面和存在一些问题,存在疑问的可以和我交流,最后给出我在源码处的一些笔记和注释,结合博客一起看。
https://github.com/QKSword/python-nmap-analyse
python-nmap的函数学习的更多相关文章
- python的super函数学习
一.为什么要用super? 在Python 2.2以前,通常的做法: class A: def __init__(self): print "enter A" print &quo ...
- python 高阶函数学习, map、reduce
一个函数可以接收另一个函数作为参数,这样的函数叫做高阶函数. 函数map(): map()函数接收两个参数,一个是函数,一个是Iterable, map把函数作用于序列的每一个元素,并把结果作为Ite ...
- python中format函数学习笔记
简而言之,format函数就是用{}来代替之前的输出字符时使用的% print('my name is %s and I am %d years old' % ('porsche',23)) 下面详细 ...
- python中高阶函数学习笔记
什么是高阶函数 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 def fun(x, y, f): print f(x), f(y) fun ...
- python库常用函数学习
os.path #返回标准化的绝对路径,基本等同于normpath() os.path.abspath(path) #返回文件名 os.path.basename(path) #返回目录名 os.pa ...
- Python学习:6.python内置函数
Python内置函数 python内置函数,是随着python解释器运行而创建的函数,不需要重新定义,可以直接调用,那python的内置函数有哪些呢,接下来我们就了解一下python的内置函数,这些内 ...
- Python学习教程(learning Python)--2.1 Python下自定义函数
在Python里可以自定义函数,实现某特定功能,这里首先要区分一下函数的定义和函数的调用两个基本概念,初学者往往容易混淆. 函数的定义是指将一堆能实现特定功能的语句用一个函数名标识起来,而函数的调用则 ...
- 『Python × C++』函数传参机制学习以及对比
一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...
- 流畅的python第五章一等函数学习记录
在python中,函数是一等对象,一等对象是满足以下条件的程序实体 1在运行时创建 2能复制给变量或数据结构的元素 3能作为参数传给函数 4能作为函数的返回结果 高阶函数(接受函数作为参数或者把函数作 ...
- Python学习笔记之Python的enumerate函数
Python 的 enumerate() 函数就像是一个神秘的黑箱,你无法简单地用一句话来概括这个函数的作用与用法. enumerate() 函数属于非常有用的高级用法,而对于这一点,很多初学者甚至中 ...
随机推荐
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)
用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...
- 网页三剑客之JS
1.javascrapt介绍 js概述 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScript是浏览器解释 ...
- WebSocke实时通讯协议
WebSocket 是什么? WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 ...
- Fiddler--Filters
本篇主要介绍Fiddler中Filters(过滤器)选项功能. 先看看Filters的界面: 一.模块一 当勾选“Use Filters”,Filters才开始工作:否则Filters中的设置内容将无 ...
- 单例模式的七种实现-Singleton(Java实现)
1. 饿汉式 实现代码: public class Singleton { private Singleton() { } private static Singleton singleton = n ...
- 如何实现Python调用C代码--python与C之间如何通信(swig)
转载: https://www.zhihu.com/question/23003213 1. C代码如何调用Python 1.1 test #include <Python.h> int ...
- 用 Mathematica 获取图片的 RGB 三基色
ColorConvert[*, "RGB"] // InputForm 其中 * 表示你把你的图片拖入 Mathematica 中.
- Java(6)for循环
一.for循环的使用场合 1.1.while循环——先判断,再循环 while(1.条件表达式){ //2.循环操作 //3.更改循环条件表达式 } 1.2.do…while——先 ...
- Flink学习(二)Flink中的时间
摘自Apache Flink官网 最早的streaming 架构是storm的lambda架构 分为三个layer batch layer serving layer speed layer 一.在s ...
- Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC
解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and RF ...