使用netaddr检查IP是否在IPNetworks列表中
我在尝试做这个的时候遇到了一些麻烦,不想用多个if语句。
伪代码:
ips = [...a list of around 1000 IPs]
cidr_list = ['192.168.10.0/24', '10.10.10.0/24', '192.168.3.0/24']
for ip in ips:
if ip in cidr_list: print ip
有没有人知道怎么用netaddr里的IPAddress和IPNetwork来正确实现这个?
4 个回答
0
你可以使用netaddr模块中的all_matching_cidrs方法。这种方法简单又准确。
ips = [ip for ip in ips if len(netaddr.all_matching_cidrs(ip, subnet_masks))> 0]
0
我希望这对你有帮助,虽然这是用bash写的,而不是python。
#!/bin/bash
ip_address_list="192.168.10.1 192.168.3.2 10.10.10.111 192.168.100.1"
cider_list="192.168.10.0/24 10.10.10.0/24 192.168.3.0/26"
bin_ip=$(IFS="." ; for i in $ip; do echo "obase=2 ; $i"| bc; done| awk '{printf "%08d", $1}'| cut -c2-)
for cider in $cider_list ; do
network_prefix=$(echo $cider |cut -d"/" -f2)
network_addr=$(echo $cider |cut -d"/" -f1)
bin_ip=$(IFS="." ; for i in $ip; do echo "obase=2 ; $i"| bc; done| awk '{printf "%08d", $1}'| cut -c2-)
if [ $(cut -b 1-$network_prefix <<< $bin_ip) = $(cut -b 1-$network_prefix <<< $bin_network_addr) ]; then
echo "The IP address $ip is in $network_addr with a network prefix of $network_prefix"
fi
done
done
0
我之前没用过 netaddr
,但这样做可以吗?
cidrs = map(IPNetwork,cidr_list)
ret = [i for i in ips if IPAddress(i) in cidrs]
0
你可以使用谷歌的 ipaddr
包来实现这个功能。
pip install ipaddr
从命令行操作。