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

相关文章:

  • 2025年浅拾兰花双萃致臻精华油:从成分与科技维度解析其护肤功效
  • 销售公司绩效考核全攻略:维度、原则与数字化赋能方案
  • 题解:P4434 [COCI 2017/2018 #2] ​​Usmjeri
  • 小程序-跳转到公众号
  • 如何解决一堆向量的问题?10、Self-attention - -一叶知秋
  • 洞悉过往,一目了然:浅述视频融合平台EasyCVR如何实现海量视频录像的智能检索与高效回看
  • 2025年国内外五款AI编程工具深入对比与推荐排行
  • CSPS 前后的话
  • 2025 年 10 月云仓 ERP,云仓 saas 系统,云仓代发系统公司最新推荐,技术实力与市场口碑深度解析
  • iOS混淆实战用多工具组合把IPA加固做成可复用的工程能力(iOS混淆 IPA加固 无源码混淆
  • cyclonessd ROS2 lidar topic 数据丢帧 系统配置
  • 2025 年 10 月 WMS 系统,WMS 软件,wms 仓储管理系统公司最新推荐,聚焦资质、案例、售后的优质机构深度解读
  • Go语言测试全攻略:从单元测试到模糊测试
  • 2025 年 10 月进销存 erp,供应链 erp,零售 ERP 公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!