Network Scanner(二):撰寫網路掃描器(程式優化)

Note: 此教學可應用在大部分的 Linux 作業系統。

前言

先前已經有使用 Python 撰寫網路掃描器,但是仍然是比較陽春的程式,本篇文章將繼續修改網路掃描器(Network Scanner)程式。本次程式中將會使用命令列解析模組 argparse,先前我們有使用過另外一個命令列解析模組 optparse(可參考此篇),但是 optparse 已經被棄用(deprecated )了,而 argparse 也是根據 optparse 為基礎發展而來,因此有非常近似的使用方式。然後也會使用 Python 的字典( Dictionaries),使得到的資料結構可以整理得更為好看,且字典提供了非常快的查詢速度。


程式優化 – 撰寫網路掃描器

開發環境

使用模組(Python 模組)

實作

以下為完整程式碼:

本程式可以與先前文章比較,其中可以看到 scan(ip) 函式中稍微做了些修改,在程式第 18 行中使用 scapy.srp 返回的資料中我們只想知道 IP 和 MAC,因此我們先將需要的資料整理成我們方便讀取的資料格式,在此就會使用到 Python 中的字典( Dictionaries)。程式碼片段如下:

將所需要的資料轉成字典格式

clients_list = []
for element in answered_list:
    client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc}
    clients_list.append(client_dict)

字典一個容器(集合)可以用來存放不同資料型態的資料,不過與串列(List)、元組(Tuples)不一樣的地方是,它的每一個元素是以鍵(Key)及值(Value)構成,再由 {} 符號將所有元素括起來。Dictionary(字典)有幾個特性:

  • Iterable(可疊代的):和前面介紹的字串(String)、串列(List)及元組(Tuples)一樣是可疊代的物件,可以透過Python迴圈來進行元素的讀取。
  • Modifiable(可修改的):和串列(List)一樣可以透過Python提供的方法(Method)來對Dictionary(字典)的值進行修改。
  • Key-Value pairs(鍵與值):Dictionary(字典)的每一個元素由鍵(Key)及值(Value)構成。鍵(Key)的資料型態通常我們使用String(字串)或Integer(整數),而值(Value)可以是任何資料型態。

在本程式中,我們將資料整理成如下的格式:

index012
value{“ip”: “10.0.2.1”, “52:54:00:12:35:00”}{“ip”: “10.0.2.2”, “52:54:00:12:35:00”}{“ip”: “10.0.2.3”, “08:00:27:98:21:6e”}

get_arguments() 函式實作了允許使用者傳遞命令行參數的功能,為了實作此函式內容,我們需要將 argparse 模組導入使用。其用法與 optparse 十分相似,差異在一些函式類別名稱不太一樣。在 get_arguments() 中,我們訂定義了一個輸入的參數 “-t”,其代表 “Target IP / IP range”。

最後,我們可以輸入指令運行腳本,其結果如下(10.0.2.1/24 可替換成欲設定的目標 IP):

python network_scanner.py -t 10.0.2.1/24

程式連結:Github


相關文章

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。