当前位置: 首页 > 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.hn-smt.com/news/184/

相关文章:

  • 2025年浅拾兰花双萃致臻精华油:从成分与技术维度解析其护肤功效
  • 2025 年进口螺杆泵,萨伯特螺杆泵,污泥螺杆泵厂家最新推荐,实力品牌深度解析采购无忧之选!
  • 为什么 AI 模型的最小理解单位是「特征」?
  • 2025年移动车载变电站厂家最新推荐榜:陕西四方华能凭硬实力成优选
  • XiaoQuQu 的 2025 CSP-S 第二轮模拟 ROUND2
  • 2025年硬密封闸阀厂家权威推荐榜单:手动闸阀/明杆闸阀/法兰闸阀源头厂家精选
  • 深入解析:ArcGIS Manager Server Add Host页面报错 HTTP Status 500
  • 2025修护洗/二硫化硒去屑/香氛/控油蓬松/洗发水品牌推荐:MASIL玛丝兰引领功效细分赛道,哪个牌子好?看实测口碑榜
  • AOP面向切面编程思想
  • 如何找到心仪的 ChatBI 智能体?Aloudata Agent 推荐给你
  • 10月第二篇
  • 天翼云智慧上云月特惠来袭,智算上云正当时!
  • 2025年临沂一次性碗打包盒公司权威推荐榜单:一次性打包碗/一次性圆形打包碗/一次性打包碗商用源头公司精选
  • 洛谷题单指南-进阶数论-CF582A GCD Table
  • 状态迁移与场景法:搞定复杂业务流测试的利器
  • 实用指南:精读C++20设计模式——行动型设计模式:责任链
  • JimuReport 积木报表 v2.1.5 版本发布,免费的可视化报表和大屏
  • 2025年半自动冲芯机生产厂家权威推荐榜单:半自动矽钢片冲芯机/半自动铁芯冲压机/半自动冲芯设备源头厂家精选
  • 告别手动埋点!Android 无侵入式数据采集方案深度解析
  • writing sentences task1
  • bao
  • 2025年贝特曼咨询:权威解析美国高端身份规划的专业服务与法律保障
  • 2025年10月美国投资移民机构推荐榜:五大权威机构深度对比分析
  • 2025年10月美国投资移民机构推荐榜单:权威评价与综合对比分析
  • 2025年10月美国投资移民机构推荐榜:五家权威机构全方位对比分析
  • 构建AI智能体:五十、ModelScope MCP广场 MCP协议 Cherry Studio:AI应用生产线 - 指南
  • zerofs nfs 协议当前的一些限制
  • 2025年10月移民美国机构推荐榜单:五大权威机构对比分析
  • 2025 年 8 卡 RTX 风扇 GPU 服务器,GPU 智算服务器,AI 训练 GPU 服务器厂家最新推荐,聚焦资质、案例、售后的优质机构深度解读
  • 2025 年精选知识管理工具:15 款融合 AI 能力的智能知识库深度对比