简介


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的函数学习的更多相关文章

  1. python的super函数学习

    一.为什么要用super? 在Python 2.2以前,通常的做法: class A: def __init__(self): print "enter A" print &quo ...

  2. python 高阶函数学习, map、reduce

    一个函数可以接收另一个函数作为参数,这样的函数叫做高阶函数. 函数map(): map()函数接收两个参数,一个是函数,一个是Iterable, map把函数作用于序列的每一个元素,并把结果作为Ite ...

  3. python中format函数学习笔记

    简而言之,format函数就是用{}来代替之前的输出字符时使用的% print('my name is %s and I am %d years old' % ('porsche',23)) 下面详细 ...

  4. python中高阶函数学习笔记

    什么是高阶函数 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 def fun(x, y, f): print f(x), f(y) fun ...

  5. python库常用函数学习

    os.path #返回标准化的绝对路径,基本等同于normpath() os.path.abspath(path) #返回文件名 os.path.basename(path) #返回目录名 os.pa ...

  6. Python学习:6.python内置函数

    Python内置函数 python内置函数,是随着python解释器运行而创建的函数,不需要重新定义,可以直接调用,那python的内置函数有哪些呢,接下来我们就了解一下python的内置函数,这些内 ...

  7. Python学习教程(learning Python)--2.1 Python下自定义函数

    在Python里可以自定义函数,实现某特定功能,这里首先要区分一下函数的定义和函数的调用两个基本概念,初学者往往容易混淆. 函数的定义是指将一堆能实现特定功能的语句用一个函数名标识起来,而函数的调用则 ...

  8. 『Python × C++』函数传参机制学习以及对比

    一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...

  9. 流畅的python第五章一等函数学习记录

    在python中,函数是一等对象,一等对象是满足以下条件的程序实体 1在运行时创建 2能复制给变量或数据结构的元素 3能作为参数传给函数 4能作为函数的返回结果 高阶函数(接受函数作为参数或者把函数作 ...

  10. Python学习笔记之Python的enumerate函数

    Python 的 enumerate() 函数就像是一个神秘的黑箱,你无法简单地用一句话来概括这个函数的作用与用法. enumerate() 函数属于非常有用的高级用法,而对于这一点,很多初学者甚至中 ...

随机推荐

  1. Linux-服务器创建swap交换分区

    服务器 swap 交换分区制作 作用:‘提升‘ 内存的容量,防止OOM(Out Of Memory) 查看当前的交换分区 # cat /proc/swaps # free -m # swapon -s ...

  2. Numpy系列(三)- 基本运算操作

    Numpy 中数组上的算术运算符使用元素级别.最后的结果使用新的一个数组来返回. import numpy as np a = np.array( [20,30,40,50] ) b = np.ara ...

  3. LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001

    数的计算(数的计数) 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n).先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上 ...

  4. RMQ(ST表)

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; int N, M, ...

  5. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  6. [物理学与PDEs]第3章习题3电磁场的矢势在 Lorentz 规范下满足的方程

    设 $\phi$ 及 ${\bf A}$ 分别为电磁场的标势及矢势 (见第一章 $\S$ 6). 试证明: 若 $\phi$ 及 ${\bf A}$ 满足条件 $$\bex \phi+\cfrac{1 ...

  7. UIWebView代码注入时机与姿势

    一个奇怪的业务场景,引发的胡乱思考 问题其实不难解决,只是顺着这个问题,发散出了一些有意思的东西 本文旨在讨论UIWebView,WKWebView有自己的机制,不用这么费劲 我们的业务最大的最重要的 ...

  8. EffectiveC++ 第2章 构造/析构/赋值运算

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 2 构造 / 析构 / 赋值 条款 05:了解C++ ...

  9. 迅为IMX6开发板真实产品案例分享-专为研发用芯选择

    迅为IMX6开发板: Android4.4系统 Linux + Qt5.7系统 Ubuntu12.04系统 部分真实案例:HMI:3D打印机:医疗设备:工控机:触控一体机:车载终端 核心板兼容:IMX ...

  10. shell 批量获取ip 和主机名

    [DNyunwei@YZSJHL24-209 li]$ cat jia.sh #!/bin/bash ip=`cat jia.ip` for i in $ip;do HostName=`ssh -t ...