当前位置: 首页 > news >正文

PYTHON脚本验证端口访问权限(支持多种格式)

# -*- coding: utf-8 -*-
import socket
import time
import sys
import osdef parse_ip_range(ip_range):ip_list = []try:if '-' in ip_range and ip_range.count('.') == 6:# Full IP range format: 192.168.1.1-192.168.1.5start_ip, end_ip = ip_range.split('-')start_parts = start_ip.split('.')end_parts = end_ip.split('.')if len(start_parts) == 4 and len(end_parts) == 4:if start_parts[0:3] == end_parts[0:3]:start = int(start_parts[3])end = int(end_parts[3])base_ip = '.'.join(start_parts[0:3])for i in range(start, end + 1):ip_list.append("%s.%d" % (base_ip, i))else:print("IP地址范围只能在最后一部分设置 '%s'" % ip_range)else:print("输入的IP地址范围格式不符合要求 '%s'" % ip_range)# Check if contains range or selector in last octetelif '-' in ip_range or '|' in ip_range:parts = ip_range.split('.')if len(parts) != 4:print("IP格式不正确 '%s'" % ip_range)return ip_listbase_ip = parts[:3]last_part = parts[3]# Handle range and selection in last octetif '-' in last_part and '|' in last_part:# Format: 1-5|6|7range_part, select_part = last_part.split('|', 1)start_str, end_str = range_part.split('-')start = int(start_str)end = int(end_str)# Add range IPsfor i in range(start, end + 1):ip_list.append("%s.%s.%s.%s" % (base_ip[0], base_ip[1], base_ip[2], i))# Add selected IPsfor select_ip in select_part.split('|'):ip_list.append("%s.%s.%s.%s" % (base_ip[0], base_ip[1], base_ip[2], select_ip))elif '-' in last_part:# Format: 1-5start_str, end_str = last_part.split('-')start = int(start_str)end = int(end_str)for i in range(start, end + 1):ip_list.append("%s.%s.%s.%s" % (base_ip[0], base_ip[1], base_ip[2], i))elif '|' in last_part:# Format: 1|3|5|7for select_ip in last_part.split('|'):ip_list.append("%s.%s.%s.%s" % (base_ip[0], base_ip[1], base_ip[2], select_ip))else:# Single IP
            ip_list.append(ip_range)except Exception as e:print("IP地址格式错误'%s': %s" % (ip_range, e))return ip_listdef parse_port_range(port_part):port_list = []try:# Handle range and selection in portsif '-' in port_part and '|' in port_part:# Format: 80-90|91|92range_part, select_part = port_part.split('|', 1)start_str, end_str = range_part.split('-')start = int(start_str)end = int(end_str)# Add range portsfor i in range(start, end + 1):port_list.append(i)# Add selected portsfor select_port in select_part.split('|'):port_list.append(int(select_port))elif '-' in port_part:# Format: 80-90start_str, end_str = port_part.split('-')start = int(start_str)end = int(end_str)for i in range(start, end + 1):port_list.append(i)elif '|' in port_part:for select_port in port_part.split('|'):port_list.append(int(select_port))else:port_list.append(int(port_part))except Exception as e:print("端口格式错误 '%s': %s" % (port_part, e))return port_listdef parse_ip_port_line(line):results = []line = line.strip()if not line or line.startswith('#'):return resultstry:if ':' in line:if line.count(':') > 1:print("不支持IPv6格式 '%s'" % line)return resultsip_part, port_part = line.rsplit(':', 1)port_list = parse_port_range(port_part)else:ip_part = lineport_list = [80]  #如果没有输入端口, 默认80端口
        ip_list = parse_ip_range(ip_part)for ip in ip_list:for port in port_list:results.append((ip, port))except ValueError as e:print("第 '%s' 行格式解析错误: %s" % (line, e))except Exception as e:print("第 '%s' 行发生未知错误: %s" % (line, e))return resultsdef test_connection(ip, port, timeout=3):try:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(timeout)start_time = time.time()result = sock.connect_ex((ip, port))end_time = time.time()response_time = round((end_time - start_time) * 1000, 2)  #毫秒
        sock.close()if result == 0:return (ip, port, True, "连接成功", response_time)else:# Provide more descriptive error messageserror_messages = {11: "网络不可达",110: "连接超时",111: "拒绝连接",113: "解析错误"}error_msg = error_messages.get(result, "错误码: %s" % result)return (ip, port, False, error_msg, response_time)except socket.timeout:return (ip, port, False, "超时", 0)except socket.gaierror as e:return (ip, port, False, "DNS解析错误: %s" % e, 0)except Exception as e:return (ip, port, False, "未知错误: %s" % e, 0)def read_and_parse_ip_list(filename="IP_LIST.txt"):all_targets = []if not os.path.exists(filename):print("错误:文件 %s 不存在!" % filename)return []try:with open(filename, 'r') as file:for line_num, line in enumerate(file, 1):line = line.strip()if line and not line.startswith('#'):targets = parse_ip_port_line(line)all_targets.extend(targets)if targets:print("第%d行: '%s' -> %d 个目标" % (line_num, line, len(targets)))else:print("第%d行: '%s' -> 0 个目标 (处理失败)" % (line_num, line))except IOError:print("读取文件失败 %s" % filename)return []except Exception as e:print("读取文件失败: %s" % e)return []return all_targetsdef check_python_version():print("Python版本: %s" % sys.version)def sequential_test(targets):successful = 0failed = 0for ip, port in targets:result_ip, result_port, success, message, response_time = test_connection(ip, port)if success:print("SUCCESS %s:%d - %s (用时: %sms)" % (result_ip, result_port, message, response_time))successful += 1else:print("FAILED  %s:%d - %s" % (result_ip, result_port, message))failed += 1return successful, faileddef main():check_python_version()print("\n读取IP文件列表...")targets = read_and_parse_ip_list("IP_LIST.txt")if not targets:print("IP地址或端口无效")returnprint("\n需要测试的IP数量是: %d" % len(targets))print("开始进行测试...\n")successful = 0failed = 0# Try to use concurrent.futures first (Python 3.x)try:from concurrent.futures import ThreadPoolExecutor, as_completedwith ThreadPoolExecutor(max_workers=20) as executor:future_to_target = {}for ip, port in targets:future = executor.submit(test_connection, ip, port)future_to_target[future] = (ip, port)for future in as_completed(future_to_target):ip, port = future_to_target[future]try:result_ip, result_port, success, message, response_time = future.result()if success:print("SUCCESS %s:%d - %s (用时: %sms)" % (result_ip, result_port, message, response_time))successful += 1else:print("FAILED  %s:%d - %s" % (result_ip, result_port, message))failed += 1except Exception as e:print("ERROR %s:%d - 测试过程发生异常: %s" % (ip, port, e))failed += 1except ImportError:successful, failed = sequential_test(targets)# Output statisticsprint("\n" + "="*50)print("成功: %d" % successful)print("失败: %d" % failed)print("合计: %d" % len(targets))if __name__ == "__main__":main()

 

# IP列表文件示例# 单个IP+单个PORT
10.192.112.235:443# 多个IP+多个PORT
10.192.112.235|236:22-23|33# 混合格式
10.66.132.123-124|125:22-23|26

 

将IP列表文件 IP_LIST.txt 放在脚本同级目录下,使用命令运行

python telnet_script.py

 

http://www.zskr.cn/news/31882.html

相关文章:

  • 2025年10月兰花油品牌推荐榜:五款高口碑产品深度对比解析
  • 杭州AI优化企业:国内GEO领域技术标杆 - 二当家
  • 构建定时 Agent,基于 Spring AI Alibaba 实现自主运行的人机协同智能 Agent
  • AI幻觉的真相:为什么ChatBI会“说谎”?
  • 2025年浅拾兰花双萃致臻精华油:从成分与技术维度解析水油平衡护肤新趋势
  • CentOS下Docker部署mysql8.0
  • 2025年浅拾兰花双萃致臻精华油:从成分与技术维度解析其护肤功效
  • 25.10.27随笔联考总结
  • 2025 年 10 月渣浆泵,耐腐耐磨渣浆泵,立式渣浆泵厂家最新推荐,聚焦资质、案例、售后的优质机构深度解读
  • 为什么 AI 模型的最小理解单位是「特征」?
  • 微算法科技(NASDAQ MLGO)探索自适应差分隐私机制(如AdaDP),根据任务复杂度动态调整噪声
  • 大理石加工设备哪家好?2025台面加工设备厂家推荐
  • ABC262Ex Max Limited Sequence
  • 路沿石加工设备厂家有哪些?2025石材机械十大品牌
  • XiaoQuQu 的 2025 CSP-S 第二轮模拟 ROUND2
  • 单体架构中的事件驱动架构:Java应用程序的渐进式重构
  • Xamarin.From ContentView 自定义标题栏
  • 快克品牌焊台
  • 2025年硬密封闸阀厂家权威推荐榜单:手动闸阀/明杆闸阀/法兰闸阀源头厂家精选
  • 2025年10月重庆装饰装修公司推荐排行榜:十家企业综合对比与实用指南
  • 2025 年非金属内进流格栅,内进流网板格栅,内进流孔板格栅厂家最新推荐,产能、专利、环保三维数据透视
  • 【IEEE出版|连续6届已EI检索|多校联办】第七届机器人、智能控制与人工智能国际学术会议(RICAI 2025)
  • 工业水泵控制移动终端APP需求于开发
  • 深入解析:ArcGIS Manager Server Add Host页面报错 HTTP Status 500
  • 小叮当 微信遮掩助手 v0.1.0 发布:PC微信隐私保护神器,灵活遮挡+隐藏窗口
  • 2025 年 10 月 erp 系统仓库管理系统,仓库管理系统,wms 仓储管理系统公司最新推荐,技术实力与市场口碑深度解析
  • 题解:P4434 [COCI 2017/2018 #2] ​​Usmjeri
  • 2025修护洗/二硫化硒去屑/香氛/控油蓬松/洗发水品牌推荐:MASIL玛丝兰引领功效细分赛道,哪个牌子好?看实测口碑榜
  • 2025 年 10 月仓库管理系统软件,电商仓库管理系统,云仓库管理系统公司最新推荐,技术实力与市场口碑深度解析!
  • Personalities Test – Free 16 Personalities (MBTI) Personality Test Online