一、效果圖預覽
使用nslookup命令查看baidu.com的IP地址
使用自己寫的端口掃描工具掃描該IP
二、涉及到的內容介紹
- 網絡編程socket
- threading多線程
- 正則表達式re
- tkinter基礎編程
三、詳細代碼解析
- 正則表達式對IP格式進行判斷,IPV4的地址是用點分十進制表示的,即114.114.144.144的形式。若格式正確,則執行端口掃描並輸出掃描結果;否則,彈出錯誤提示框,提示IP格式錯誤。
def Judgment_IP(self):
# 判斷輸入的IP格式是否正確(正則)
reg = '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
ip = re.match(reg,self.IP.get())
if ip is not None:
action(ip.group())
Port_open_content = Label(self.init_window_name, text=Port_is_open)
Port_open_content.grid(row=4,column=1)
else:
print("IP格式錯誤")
tkinter.messagebox.showerror('錯誤', 'IP格式錯誤')
- 編寫工具中寫tkinter窗體用到的方法
- title():設置窗體的名稱
self.init_window_name.title('簡單的端口掃描工具')
- geometry():設置窗體的大小,看下面四個值,寬、高、位置x,y
self.init_window_name.geometry('300x600+150+150')
- iconbitmap():設置窗體的圖標
self.init_window_name.iconbitmap('./panda_128px_1227690_easyicon.net.ico')
- Label:組件,用於在指定的窗口中顯示文本和圖像
label = Label(self.init_window_name,text ="IP:",anchor='c').grid(row=0)
- Entry:組件,文本框用來讓用戶輸入一行文本字符串
self.IP = Entry(self.init_window_name)
self.IP.grid(row=0,column=1)
四、附完整代碼
# -*- conding: utf-8 -*-
from tkinter import *
import tkinter.messagebox
from socket import *
from threading import Thread,Lock
import sys,re
Port_is_open = ""
class Port_Scan():
def __init__(self,init_window_name):
self.init_window_name = init_window_name
#設置窗口
def set_init_window(self):
#設置名稱
self.init_window_name.title('簡單的端口掃描工具')
#設置窗體大小
self.init_window_name.geometry('300x600+150+150')
#設置圖標
self.init_window_name.iconbitmap('./panda_128px_1227690_easyicon.net.ico')
# 設置輸入框 Entry
label = Label(self.init_window_name,text ="IP:",anchor='c').grid(row=0)
self.IP = Entry(self.init_window_name)
self.IP.grid(row=0,column=1)
#設置掃描按鈕
Button(self.init_window_name,text="開始掃描",anchor='c',command=self.Judgment_IP).grid(row=0,column=2)
def Judgment_IP(self):
# 判斷輸入的IP格式是否正確(正則)
reg = '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
ip = re.match(reg,self.IP.get())
if ip is not None:
action(ip.group())
Port_open_content = Label(self.init_window_name, text=Port_is_open)
Port_open_content.grid(row=4,column=1)
else:
print("IP格式錯誤")
tkinter.messagebox.showerror('錯誤', 'IP格式錯誤')
class mythread(Thread):
def __init__(self, fun, args):
Thread.__init__(self)
self.fun = fun
self.args = args
def run(self):
self.fun(*self.args)
def action(ip):
def scan(h, p):
global Port_is_open
try:
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect((host, p))
if lock.acquire():
Port_is_open += ""+ str(p) + " -> opened\n"
lock.release()
except error:
if lock.acquire():
Port_is_open +=""+ str(p) + " -> not open\n"
lock.release()
finally:
tcpCliSock.close()
del tcpCliSock
lock = Lock()
ports = [21, 23, 25, 53, 69, 80, 135, 137, 139, 1521, 1433, 3306, 3389]
host = ip
mt = []
for p in ports:
t = mythread(scan,(host, p))
mt.append(t)
for m in mt:
m.start()
for m in mt:
m.join()
print(Port_is_open)
if __name__ == '__main__':
init_window = Tk()
scan = Port_Scan(init_window)
scan.set_init_window()
init_window.mainloop()
五、對tkinter的一些補充
- root.title(‘標題名’) 修改框體的名字,也可在創建時使用className參數來命名;
- root.resizable(0,0) 框體大小可調性,分別表示x,y方向的可變性;
- root.geometry(‘250x150’) 指定主框體大小;
- root.quit() 退出;
- root.update_idletasks()
- root.update() 刷新頁面;
#設置窗體背景顏色
# self.init_window_name["background"] = "blue"
#設置透明度
# self.init_window_name.attributes("-alpha",0.8)
#設置全全屏:True全屏,Flase正常顯示(一般不設置)
# self.init_window_name.attributes("-fullscreen",False)
# 設置窗體置頂
# self.init_window_name.attributes("-topmost",True)
# 設置成脫離工具欄(一般不設置)
# self.init_window_name.overrideredirect(False)
# 獲取屏幕的大小
# screen_height = self.init_window_name.winfo_screenheight()
# screen_width = self.init_window_name.winfo_screenwidth()
# print("寬%d,高%d"%(screen_width,screen_height))
# 獲取窗體大小
# win_height = self.init_window_name.winfo_height()
# win_width = self.init_window_name.winfo_width()
# print("寬%d,高%d" % (win_width, win_height))
#獲取窗體的位置
# win_x = self.init_window_name.winfo_x()
# win_y = self.init_window_name.winfo_y()
# print("%d,%d" % (win_x, win_y))
關注我,帶你一起寫bug
warning :未經授權,不得轉載
有問題的小夥伴請在下方留言,喜歡就點個贊吧