循环查询指定服务器开放端口列表
# @Time : 2025/3/22
# @Author : cookie
# @Desc :
import socket
import concurrent.futures
from datetime import datetime
# 设置目标IP和端口范围
target_ip = input("请输入目标IP地址: ")
start_port = int(input("请输入起始端口(1): "))
end_port = int(input("请输入终止端口(65535): "))
# 创建一个函数来检查端口是否开放
def scan_port(target_ip, port):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
socket.setdefaulttimeout(1) # 设置连接超时时间
result = sock.connect_ex((target_ip, port)) # 检查端口
if result == 0:
print(f"端口 {port} 开放")
except socket.error as e:
# 可以记录错误,但扫描不会中断
pass
# 获取当前时间并开始扫描
start_time = datetime.now()
# 使用线程池进行并发端口扫描
with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
# 使用列表生成式将所有任务提交给线程池
executor.map(lambda port: scan_port(target_ip, port), range(start_port, end_port + 1))
end_time = datetime.now()
# 显示扫描所花费的时间
scan_duration = end_time - start_time
print(f"扫描完成! 耗时: {scan_duration}")