在原作者之上做了一点修改
代码:
from tkinter import *
import socket, re
import threading
import time
import queue
import tkinter.messagebox as msgbox
from tkinter.filedialog import askopenfilename
class MyGui():
def __init__(self, init_window_name):
self.init_window_name = init_window_name
def set_init_window(self):
self.k = 0
#初始化窗口
self.init_window_name.title("端口扫描器 v1.1 Change By Lan")
self.window_center(400, 520)
self.init_window_name.resizable(0,0) #固定窗口,禁止放大缩小
# 定义区域,把全局分为上中下部分
self.frame_top = Frame(self.init_window_name, width=400, height=200)
self.frame_center = Frame(self.init_window_name, width=400, height=300)
self.frame_foot = Frame(self.init_window_name, width=400, height=10)
self.frame_top.grid(row=0, column=0)
self.frame_center.grid(row=1, column=0)
self.frame_foot.grid(row=2, column=0, pady="20")
# 上部分布局
self.ip_lb_top = Label(self.frame_top, text="IP地址", font="楷体")
self.port_lb_top = Label(self.frame_top, text="端口范围", font="楷体")
self.ip_input = StringVar()
self.port_input = StringVar()
self.ip_input.set('格式:127.0.0.1')
self.port_input.set('格式:1-65535')
self.ip_content = Entry(self.frame_top, textvariable=self.ip_input, font="楷体")
self.port_content = Entry(self.frame_top, textvariable=self.port_input, font="楷体")
self.PortScan = Button(self.frame_top, text="开始扫描", command=self.runing, font="楷体")
self.StopScan = Button(self.frame_top, text="停止扫描", command=self.stop, font="楷体",fg='red')
self.importfile = Button(self.frame_top, text="批量导入", command=self.intofile, font="楷体",fg='blue')
self.ip_lb_top.place(x=30, y=20)
self.ip_content.place(x=105, y=20)
self.port_lb_top.place(x=30, y=60)
self.port_content.place(x=105, y=60)
self.PortScan.place(x=32, y=110)
self.StopScan.place(x=190, y=110)
self.importfile.place(x=285, y=18)
# 中间部分布局
self.porttext = Text(self.frame_center, width=41, height=18,font="楷体",fg='blue')
self.scroll = Scrollbar(self.frame_center)
self.scroll.pack(side=RIGHT, fill=Y)
self.porttext.pack(side=RIGHT, fill=Y)
self.scroll.config(command=self.porttext.yview)
self.porttext.config(yscrollcommand=self.scroll.set)
# 下部分布局
# 窗口居中
def window_center(self, width, height):
screenwidth = self.init_window_name.winfo_screenwidth()
screenheight = self.init_window_name.winfo_screenheight()
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
self.init_window_name.geometry(size)
# 获取当前时间
def get_current_time(self):
current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
return current_time
class MyThread(threading.Thread):
def __init__(self, func, *args):
super().__init__()
self.func = func
self.args = args
self.setDaemon(True)
self.start() # 在这里开始
def run(self):
self.func(*self.args)
def intofile(self):
msgbox.showinfo(title='提示', message='作者很懒,还没开发好!')
filenameReading = askopenfilename()
infile = open(filenameReading, 'r')
self.porttext.delete(1.0, END)
self.porttext.insert(END, infile.read())
infile.close()
def stop(self):
if self.k == 0:
msgbox.showinfo(title='提示', message='扫描未开始 或 已停止')
else:
self.k = 0
self.porttext.insert(END, '\n' + '扫描已暂停......')
def runing(self):
self.k = 1
self.porttext.delete(1.0, END)
if re.match(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", self.ip_content.get()):
self.ip = self.ip_content.get()
else:
msgbox.showerror(title="Error", message="ip格式错误或不合法,请重新输入")
return
if re.match(r"^(?:[0-9]{1,5}-){1}[0-9]{1,5}$", self.port_content.get()):
ports = self.port_content.get()
else:
msgbox.showerror(title="Error", message="端口范围·格式错误,格式为:xxx-xxx")
return
ports = ports.split('-')
startport = ports[0]
endport = ports[1]
p=0
self.porttext.insert(END, "当前时间为: "+self.get_current_time()+"\nIP地址:"+self.ip+"\n端口范围:"+self.port_content.get()+"\n\n扫描结果\n\n")
self.portslist = list(range(int(startport), int(endport) + 1))
port_queue = queue.Queue()
for port in self.portslist:
port_queue.put(port)
p+=1
for i in range(0, 3000):
self.MyThread(self.scan, port_queue)
if p==int(endport):
self.porttext.insert(END, '耗时:'+'\n')
def scan(self, port_queue):
while self.k == 1:
if port_queue.empty():
break
port = port_queue.get()
timeout = 3
s = socket.socket()
s.settimeout(timeout)
try:
s.connect((self.ip, port))
string = "Port " + str(port) + " is OPEN\n"
self.porttext.insert(END, string)
self.porttext.see(END)
except Exception as e:
pass
finally:
s.close()
if __name__ == "__main__":
pygui=Tk()
init_window = MyGui(pygui)
init_window.set_init_window()
pygui.mainloop()
成品:
![](https://i-blog.csdnimg.cn/blog_migrate/302c246352ddfe7438d8b4bdd774978e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/96f7728a8b726afdf54039a79951c4b3.png)
最后附上安全渗透扫描 专用的端口扫描工具:
御剑高速端口扫描工具beta
https://www.aliyundrive.com/s/fXSkSMGLgQg