使用netaddr检查IP是否在IPNetworks列表中

0 投票
4 回答
1019 浏览
提问于 2025-04-18 03:36

我在尝试做这个的时候遇到了一些麻烦,不想用多个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

从命令行操作。

撰写回答