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

python解析ip范围,判断ip是否在ip范围内

目录

1. 背景

2. 代码使用示例

2.1 分割ip,横杠 (-) 的ip范围

2.2 判断ip在掩码(/)的范围内

2.3 判断ip在横杠(-)的范围内

2.3.1 格式:192.168.1.1-192.168.1.10

2.3.2 格式:192.168.1.1-10

2.3.3 格式 192.168-169.*.*

2.3.4 格式192.168.*.*或192.*.168.*等

3. 其他扩展

3.1 校验是否为ipv4/ipv6

3.2 判断一个网段/前缀是另一个的子网


1. 背景

各种各样的ip范围,ip通配符等等,判断ip是否符合在这些范围内,搜索耗时耗力,整理出来,后续使用直接复制,有更好用的备注留言

2. 代码使用示例

2.1 分割ip,横杠 (-) 的ip范围

#! -*- coding:utf-8 -*def split_ip_range(range):"""处理以下格式分割192.168.1.1-10   拆分成192.168.1.1-192.168.1.10192.168.1-10.*   拆分成192.168.1.*-192.168.10.*192.168-169.*.*  拆分成192.168.*.*-192.169.*.*192-193.168.*.*  拆分成192.168.*.*-193.168.*.*192.168.1.1-10   拆分成192.168.1.1-192.168.1.10192.168.1.1-192.168.1.10   拆分成192.168.1.1-192.168.1.10:param range::return:"""if "-" not in range:raise ValueError("处理不了其他格式的,拜拜")start, end = range.split("-")start_list, end_list = start.split("."), end.split(".")start_lenght = len(start_list)end_lenght = len(end_list)# 暂不简化,逻辑简洁if start_lenght == 1 and end_lenght == 4:ret_start = start_list + end_list[1:]ret_end = end_listelif start_lenght == 2 and end_lenght == 3:ret_start = start_list + end_list[1:]ret_end = start_list[:1] + end_listelif start_lenght == 3 and end_lenght == 2:ret_start = start_list + end_list[1:]ret_end = start_list[:2] + end_listelif start_lenght == 4 and end_lenght == 1:ret_start = start_list + end_list[1:]ret_end = start_list[:3] + end_listelif start_lenght == 4 and end_lenght == 4:ret_start = start_listret_end = end_listelse:raise ValueError("处理不了其他格式的,再见")return ",".join(ret_start), ",".join(ret_end)if __name__ == '__main__':# 测试ranges = ["192-193.168.*.*","192.168-169.*.*","192.168.1-10.*","192.168.1.1-10","192.168.1.1-192.168.1.10"]for v in ranges:print(f"{v},拆分后是:{split_ip_range(v)}")

2.2 判断ip在掩码(/)的范围内

import ipaddressdef is_ip_in_cidr(ip, cidr):"""判断一个IP地址是否在一个CIDR掩码范围内。:param ip: 字符串格式的IP地址:param cidr: CIDR格式的网络地址(如 "192.168.1.0/24"):return: 如果IP地址在CIDR范围内返回True,否则返回False"""try:# 创建一个IP地址对象ip_obj = ipaddress.ip_address(ip)# 创建一个网络对象network = ipaddress.ip_network(cidr, strict=False)# 检查IP地址是否在网络范围内return ip_obj in networkexcept ValueError as e:print(f"Error parsing IP or CIDR: {e}")return False# 测试用例
test_cases = [("192.168.1.5", "192.168.1.0/24"),("192.168.1.254", "192.168.1.0/24"),("192.168.2.1", "192.168.1.0/24"),("192.168.1.10", "192.168.1.8/29"),("192.168.1.12", "192.168.1.8/29")
]for ip, cidr in test_cases:print(f"{ip} 是否在 {cidr} 范围内?{is_ip_in_cidr(ip, cidr)}")

2.3 判断ip在横杠(-)的范围内

2.3.1 格式:192.168.1.1-192.168.1.10

支持ipv4, ipv6网段

import ipaddress# 支持ipv4, ipv6
def is_ip_in_range(ip_range_str, ip_address_str):"""判断一个IP地址是否在一个IP段内。参数:ip_range_str (str): IP段,格式为"start_ip-end_ip"。ip_address_str (str): 要检查的IP地址。返回:bool: 如果IP地址在IP段内,返回True;否则返回False。"""try:# 将IP范围字符串拆分为起始IP和结束IPstart_ip, end_ip = ip_range_str.split('-')# 将起始IP和结束IP以及要检查的IP地址转换为IP地址对象start_ip_address = ipaddress.ip_address(start_ip)end_ip_address = ipaddress.ip_address(end_ip)ip_to_check = ipaddress.ip_address(ip_address_str)# 判断IP地址是否在起始IP和结束IP之间return start_ip_address <= ip_to_check <= end_ip_addressexcept Exception as e:# print(f"Error: {e}")return False

2.3.2 格式:192.168.1.1-10

1. 使用2.1的方法分割

2. 使用2.3.1的方法判断

2.3.3 格式 192.168-169.*.*

包含*号的

1. 使用2.1的方法分割

2. 分割后的起始ip,* 做转换

3. 使用2.3.1方法判断

# 开始ip的*换为0
# 结束ip的*换为255ip_range_str = '192.*.1.1-192.*.10.1'  # 2.1方法返回ip_range_str = '192.0.1.1-192.255.10.1'  # 修改
ip_str = '192.168.10.1'
print(is_ip_in_range(ip_range_str, ip_str))

2.3.4 格式192.168.*.*或192.*.168.*等

1. 先如下处理数据

2. 再调用2.3.1方法

ip = "192.168.*.*"start = ip.replace("*", "0")
end = ip.replace("*", "255")
print(f"{start}-{end}")   # 192.0.0.1-192.255.255.1

3. 其他扩展

3.1 校验是否为ipv4/ipv6

import ipaddressdef validate_ip(ip_address: str):"""校验是否为ipv4或ipv6@param ip_address: ip@return:"""try:ipaddress.ip_address(ip_address)return Trueexcept ValueError:return False

3.2 判断一个网段/前缀是另一个的子网

import ipaddressdef is_subnet_of(a, b):"""Returns True if network a is a subnet of network b.网络a是网络b的子网,返回true@param a: 子网@param b: 父网@return:  bool"""try:# 将前缀转换为IP网络对象a_network = ipaddress.ip_network(a, strict=True)b_network = ipaddress.ip_network(b, strict=True)return (a_network.network_address >= b_network.network_address anda_network.broadcast_address <= b_network.broadcast_address)except Exception as e:print(e)return False

http://www.lryc.cn/news/440522.html

相关文章:

  • Springboot错误日志切面,找到post请求体被消费后的数据
  • 【二十】【QT开发应用】listwidget右键菜单和删除item
  • LabVIEW机动车动态制动性能校准系统
  • Linux(CentOS8)服务器安装RabbitMQ
  • R语言进行无序多分类Logistic回归
  • Maven从入门到精通(三)
  • Red Hat 和 Debian Linux 对比
  • Axure设计之全屏与退出全屏交互实现
  • 如何测试出自己电脑的网络速度(网速)?
  • 如何利用AI进行有效的科技产品发布
  • 二层、三层网络基本原理
  • 全面掌握 Jest:从零开始的测试指南(上篇)
  • Go 交叉编译
  • goctl安装失败
  • DebateGPT:通过多智能体辩论监督微调大模型
  • 【最新综述】基于深度学习的超声自动无损检测(下)
  • kali——tshark的使用
  • TortoiseSVN图标不显示的解决
  • Oracle 11gR2打PSU补丁详细教程
  • 2.4 卷积1
  • OA项目值用户登入首页展示
  • 如何关闭前端Chrome的debugger反调试
  • 硬件工程师笔试面试——晶振
  • 如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程
  • linux上用yolov8训练自己的数据集(pycharm远程连接服务器)
  • Git rebase 的使用(结合图与案例)
  • 一文讲懂Mac中的环境变量
  • 将硬盘的GPT 转化为MBR格式
  • C++基于select和epoll的TCP服务器
  • SpringBoot 读取配置文件的4种方式