Skip to main content
 首页 » 编程设计

Python之计算 IP 范围内 IP 的最佳方法

2025年05月04日22java哥

我有一个 python 脚本,它从 arp 表中获取所有 IP 并将其分配给一个变量。我有 for 循环创建另外两个变量 start_IP 包含子网的第一个 IP 和 last_IP 包含同一子网中的最后一个 IP。对于每个循环,我将有不同的开始和结束 IP。

我正在尝试检查包含所有 IP 的变量并查看每个子网下有多少 IP。

执行此操作的最佳方法是什么?这是一个硬编码的例子: 计数 = 0

arps = ['10.20.30.130','10.20.30.131','10.20.30.132', '10.20.30.133',  
'10.20.30.136', '10.20.30.137', '10.20.30.138', '10.20.30.139', '10.20.30.140', '10.20.30.141', '10.20.30.143', '10.20.30.149'] 
 start_ip = "10.20.30.132" 
 end_ip = "10.20.30.142" 
 count = 0       
 for arp in arps: 
    if arp >= start_ip and arp <= end_ip: 
        count = count + 1 
        print count 
    else: 
        continue 
 
 print "Count: ", count 

有更好更快的方法吗?

请您参考如下方法:

两种方式。简单的方法:

IP 地址逐个八位位组进行比较。有趣的是,Python 列表逐个元素地进行比较。因此,如果您只是按点拆分 IP 地址并将列表映射到 int,则可以正确比较它们。

更简单的方法:

ipaddress.ip_address 是可比较的,只要比较的地址是相同的版本(IPv4 或 IPv6)。

但是,字符串比较并不能提供正确的 IP 地址排序:

'1.12.1.1' < '1.2.1.1' 
# => True (should be False) 

除了那些问题,您的代码没有问题。它可以写得更简洁:

import ipaddress 
arps = ['10.20.30.130','10.20.30.131','10.20.30.132', '10.20.30.133',  
    '10.20.30.136', '10.20.30.137', '10.20.30.138', '10.20.30.139',  
    '10.20.30.140', '10.20.30.141', '10.20.30.143', '10.20.30.149'] 
start_ip = "10.20.30.132" 
end_ip = "10.20.30.142" 
 
start_ip_ip = ipaddress.ip_address(start_ip) 
end_ip_ip = ipaddress.ip_address(end_ip) 
 
sum(1 for ip in arps if start_ip_ip <= ipaddress.ip_address(ip) <= end_ip_ip) 
# => 8 

如果您特别想查看特定子网中的地址,您甚至不需要使用开始和结束地址,如果您知道子网规范:

ipaddress.ip_address('192.168.1.17') in ipaddress.ip_network('192.168.0.0/16') 
# => True