1. 程式人生 > >python-nmap的函數學習

python-nmap的函數學習

查找 可能 ogr () 主機 src pro version xml文件

簡介


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的函數學習