实例介绍
🖥️ 运行效果
🚀 实例简介
一款基于Python Tkinter开发的TCP端口扫描工具,支持并发扫描、服务识别和结果导出。可快速检测目标主机的开放端口,识别常见网络服务,适用于网络诊断、安全审计和运维管理场景。
💻 核心代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
网络端口扫描与服务探测工具
功能:扫描目标主机的TCP端口,检测开放状态,支持并发扫描与结果导出
"""
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import socket, threading, csv, platform
CHINESE_FONT = "WenQuanYi Zen Hei" if platform.system() == "Linux" else "Microsoft YaHei"
class PortScannerApp:
def __init__(self, root):
root.title("网络端口扫描工具 v1.0")
root.geometry("780x520")
root.configure(bg="#f0f0f0")
# 顶部输入区
input_frame = tk.LabelFrame(root, text="扫描参数", font=(CHINESE_FONT, 11, "bold"), bg="#f0f0f0", padx=10, pady=8)
input_frame.pack(fill="x", padx=10, pady=(10, 5))
tk.Label(input_frame, text="目标主机:", font=(CHINESE_FONT, 10), bg="#f0f0f0").grid(row=0, column=0, sticky="w")
self.target_entry = tk.Entry(input_frame, width=28, font=(CHINESE_FONT, 10))
self.target_entry.insert(0, "127.0.0.1")
self.target_entry.grid(row=0, column=1, padx=5)
tk.Label(input_frame, text="端口范围:", font=(CHINESE_FONT, 10), bg="#f0f0f0").grid(row=0, column=2, sticky="w", padx=(10, 0))
self.port_start = tk.Entry(input_frame, width=8, font=(CHINESE_FONT, 10))
self.port_start.insert(0, "1")
self.port_start.grid(row=0, column=3, padx=2)
tk.Label(input_frame, text="-", font=(CHINESE_FONT, 10), bg="#f0f0f0").grid(row=0, column=4)
self.port_end = tk.Entry(input_frame, width=8, font=(CHINESE_FONT, 10))
self.port_end.insert(0, "1024")
self.port_end.grid(row=0, column=5, padx=2)
tk.Button(input_frame, text="开始扫描", font=(CHINESE_FONT, 10, "bold"), bg="#4CAF50", fg="white",
command=self.start_scan).grid(row=0, column=6, padx=(15, 0))
tk.Button(input_frame, text="导出结果", font=(CHINESE_FONT, 10), bg="#2196F3", fg="white",
command=self.export_csv).grid(row=0, column=7, padx=5)
# 状态栏
self.status_var = tk.StringVar(value="就绪 - 请输入目标主机和端口范围")
tk.Label(root, textvariable=self.status_var, font=(CHINESE_FONT, 9), bg="#f0f0f0", fg="#666", anchor="w").pack(fill="x", padx=10)
# 结果表格
columns = ("port", "status", "service")
tree_frame = tk.Frame(root, bg="#f0f0f0")
tree_frame.pack(fill="both", expand=True, padx=10, pady=5)
self.tree = ttk.Treeview(tree_frame, columns=columns, show="headings", height=18)
self.tree.heading("port", text="端口号")
self.tree.heading("status", text="状态")
self.tree.heading("service", text="服务名称")
self.tree.column("port", width=100, anchor="center")
self.tree.column("status", width=120, anchor="center")
self.tree.column("service", width=400, anchor="w")
scrollbar = ttk.Scrollbar(tree_frame, orient="vertical", command=self.tree.yview)
self.tree.configure(yscrollcommand=scrollbar.set)
self.tree.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
self.results = [] # 存储扫描结果
self.scanning = False
def get_service_name(self, port):
"""根据端口号返回常见服务名称"""
services = {21:"FTP",22:"SSH",23:"Telnet",25:"SMTP",53:"DNS",80:"HTTP",110:"POP3",
143:"IMAP",443:"HTTPS",445:"SMB",993:"IMAPS",995:"POP3S",
1433:"MSSQL",1521:"Oracle",3306:"MySQL",3389:"RDP",5432:"PostgreSQL",
5900:"VNC",6379:"Redis",8080:"HTTP-Proxy",8443:"HTTPS-Alt",27017:"MongoDB"}
return services.get(port, "未知服务")
def scan_port(self, target, port):
"""扫描单个端口(线程安全)"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.8)
result = sock.connect_ex((target, port))
sock.close()
if result == 0:
💡 适用场景
办公自动化、数据分析、快速原型开发
标签:
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论