一步步教你用 Python 構建一個網(wǎng)絡掃描工具,快速識別網(wǎng)絡中的設備
在網(wǎng)絡運維和安全中,網(wǎng)絡掃描工具能幫助管理員快速發(fā)現(xiàn)網(wǎng)絡問題、檢測設備連通性和安全漏洞。今天將介紹如何用Python創(chuàng)建一個簡易的圖形界面網(wǎng)絡掃描器,該工具結合了ping命令、nmap掃描以及ARP協(xié)議,用于掃描目標IP,收集如MAC地址和操作系統(tǒng)類型等信息。
之前我們已經(jīng)分享過一篇關于如何使用Python腳本掃描局域網(wǎng)IP并獲取在線設備MAC地址的文章。為了讓大家日后使用起來更加方便,這次我們將這個腳本通過Python的第三方庫Tkinter封裝成了一個簡單易用的小軟件。
一、項目概述
本項目創(chuàng)建了一個圖形化界面的網(wǎng)絡掃描工具,用戶可以輸入目標IP或網(wǎng)段,點擊開始掃描按鈕,程序會自動掃描指定的IP地址,檢測哪些主機在線,并展示其MAC地址和操作系統(tǒng)信息。工具使用了Python中的tkinter庫創(chuàng)建GUI界面,并通過多線程提高掃描效率。
二、關鍵模塊與庫
- tkinter:用于創(chuàng)建圖形界面,包括文本框、按鈕、標簽、進度條等控件。
- subprocess:用于執(zhí)行系統(tǒng)命令(如ping、arp、nmap),并獲取命令的輸出。
- re:用于正則表達式匹配,提取IP地址、MAC地址和操作系統(tǒng)信息。
- concurrent.futures:通過線程池執(zhí)行并發(fā)任務,提高掃描效率。
三、代碼實現(xiàn)
1. 初始化GUI界面
首先,我們通過tkinter創(chuàng)建一個窗口,窗口中包括輸入框、按鈕和一個表格來顯示掃描結果:
class NetworkScannerGUI:
def __init__(self, master):
self.master = master
master.title("網(wǎng)絡掃描器 v1.0")
# 創(chuàng)建輸入?yún)^(qū)域
input_frame = ttk.Frame(master, padding="10")
input_frame.pack(fill=tk.X)
ttk.Label(input_frame, text="目標IP/網(wǎng)段:").grid(row=0, column=0, sticky=tk.W)
self.ip_entry = ttk.Entry(input_frame, width=25)
self.ip_entry.grid(row=0, column=1, padx=5)
self.scan_button = ttk.Button(input_frame, text="開始掃描", command=self.start_scan)
self.scan_button.grid(row=0, column=2, padx=5)
# 新增提示標簽
ttk.Label(input_frame, text="輸入示例:192.168.1.100(單個IP)或 192.168.1(網(wǎng)段)",
foreground="gray").grid(row=1, column=0, columnspan=3, pady=5, sticky=tk.W)
# 創(chuàng)建結果顯示表格
self.result_tree = ttk.Treeview(master, columns=('IP', 'MAC', '平臺'), show='headings')
self.result_tree.heading('IP', text='IP地址')
self.result_tree.heading('MAC', text='MAC地址')
self.result_tree.heading('平臺', text='操作系統(tǒng)')
self.result_tree.pack(expand=True, fill=tk.BOTH, padx=10, pady=5)
# 進度條
self.progress = ttk.Progressbar(master, mode='indeterminate')
2. 驗證輸入和生成掃描目標
我們添加了輸入驗證功能,確保用戶輸入的是有效的IP或網(wǎng)段格式,并根據(jù)輸入生成需要掃描的IP地址列表:
def validate_input(self, ip_str):
"""驗證輸入的IP格式"""
if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}(\.\d{1,3})?$", ip_str):
returnTrue
messagebox.showerror("錯誤", "無效的IP地址格式!")
returnFalse
def generate_targets(self, ip_str):
"""生成要掃描的目標列表"""
if ip_str.count('.') == 3: # 單個IP
return [ip_str]
# 添加網(wǎng)段格式驗證
if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}$", ip_str):
return generate_ip_range(ip_str)
messagebox.showerror("錯誤", "無效的網(wǎng)段格式!")
return []
3. 開始掃描
點擊開始掃描按鈕后,我們創(chuàng)建一個新的線程來執(zhí)行掃描任務,避免阻塞主線程。掃描過程中,程序會啟動進度條,提示用戶掃描進度:
def start_scan(self):
"""啟動掃描線程"""
target = self.ip_entry.get().strip()
ifnot self.validate_input(target):
return
self.scan_button.config(state=tk.DISABLED)
self.progress.pack(fill=tk.X, padx=10)
self.progress.start()
self.result_tree.delete(*self.result_tree.get_children())
# 創(chuàng)建掃描線程
scan_thread = threading.Thread(
target=self.run_scan,
args=(target,),
daemnotallow=True
)
scan_thread.start()
4. 執(zhí)行單個IP的掃描
通過ping命令檢查IP是否在線,如果在線,再通過arp獲取MAC地址,并通過nmap獲取操作系統(tǒng)信息:
def scan_single_ip(ip):
if ping_ip(ip):
mac = get_mac(ip)
platform_info = get_platform(ip)
return {"ip": ip, "mac": mac, "platform": platform_info}
return None
5. 掃描完成
當掃描完成后,我們停止進度條,并顯示完成信息:
def scan_complete(self):
"""掃描完成處理"""
self.progress.stop()
self.progress.pack_forget()
self.scan_button.config(state=tk.NORMAL)
messagebox.showinfo("完成", "掃描任務已完成!")
四、打包exe軟件包
將Python腳本打包成.exe可執(zhí)行文件,可以使用多種工具,其中最常用的工具是PyInstaller。下面是使用PyInstaller將Python腳本打包成Windows可執(zhí)行文件的步驟。
1. 安裝PyInstaller
首先,確保你已安裝了PyInstaller。你可以通過pip來安裝:
pip install pyinstaller
2. 打包Python腳本
假設你的Python腳本名為network_scanner.py,你可以通過以下命令將其打包成.exe文件:
pyinstaller --onefile network_scanner.py
- --onefile:表示將所有內(nèi)容打包成一個單獨的.exe文件。
- network_scanner.py:是你的Python腳本文件。
如果你不使用--onefile,PyInstaller會創(chuàng)建一個文件夾,其中包含多個文件和依賴庫,而不是一個單獨的可執(zhí)行文件。
3. 生成的可執(zhí)行文件
在打包完成后,你可以在當前目錄下找到一個dist文件夾,里面會包含你打包的network_scanner.exe文件。
- 默認情況下,打包后的文件位于 dist/ 文件夾下。
- 你可以在dist文件夾中找到生成的.exe文件。
雙擊運行.exe文件即可進行局域網(wǎng)掃描,如下圖所示:
五、總結
通過本項目,我們成功地創(chuàng)建了一個基于Python的網(wǎng)絡掃描器,具備掃描單個IP、IP網(wǎng)段、獲取MAC地址、操作系統(tǒng)信息等功能。利用Tkinter打造了簡潔的GUI界面,借助多線程技術提高了掃描效率,進度條的加入則大大改善了用戶體驗。