50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
import ipaddress
|
||
import sys
|
||
|
||
def cidr_to_range(cidr):
|
||
network = ipaddress.ip_network(cidr)
|
||
return (network.network_address, network.broadcast_address)
|
||
|
||
def range_to_cidr(start, end):
|
||
return [str(cidr) for cidr in ipaddress.summarize_address_range(start, end)]
|
||
|
||
def merge_cidrs(cidrs):
|
||
ranges = sorted(cidr_to_range(cidr) for cidr in cidrs)
|
||
merged = []
|
||
for start, end in ranges:
|
||
if not merged or start > merged[-1][1] + 1:
|
||
merged.append([start, end])
|
||
else:
|
||
merged[-1][1] = max(merged[-1][1], end)
|
||
|
||
result = []
|
||
for start, end in merged:
|
||
result.extend(range_to_cidr(start, end))
|
||
return result
|
||
|
||
def main():
|
||
print("请输入IP段列表(每行一个CIDR格式的IP段):")
|
||
print("输入完成后,请按Ctrl+D (Unix/Linux/Mac) 或 Ctrl+Z 然后按Enter (Windows) 来结束输入")
|
||
|
||
input_cidrs = []
|
||
for line in sys.stdin:
|
||
cidr = line.strip()
|
||
try:
|
||
ipaddress.ip_network(cidr)
|
||
input_cidrs.append(cidr)
|
||
except ValueError:
|
||
print(f"无效的CIDR格式: {cidr},已忽略", file=sys.stderr)
|
||
|
||
if not input_cidrs:
|
||
print("未输入有效的IP段", file=sys.stderr)
|
||
return
|
||
|
||
merged_cidrs = merge_cidrs(input_cidrs)
|
||
|
||
print("\n合并后的IP段:")
|
||
for cidr in merged_cidrs:
|
||
print(cidr)
|
||
|
||
if __name__ == "__main__":
|
||
main()
|