0

如果没有多个 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

4 回答 4

0

不能说我以前用过netaddr,但这有效吗?

cidrs = map(IPNetwork,cidr_list)
ret = [i for i in ips if IPAddress(i) in cidrs]
于 2014-04-21T15:27:58.703 回答
0

您可以为此使用 Googleipaddr软件包

pip install ipaddr

从命令行

于 2014-04-21T15:17:01.890 回答
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
于 2014-04-21T17:37:46.783 回答
0

您可以使用 netaddr 模块中的 all_matching_cidrs 方法。简单而准确。

ips = [ip for ip in ips if len(netaddr.all_matching_cidrs(ip, subnet_masks))> 0]

于 2018-12-05T11:30:51.460 回答