我们有 CIDR 列表
1.10.10.0/24
5.154.0.0/16
5.181.219.0/24
23.90.68.0/24
31.40.214.0/24
我想检查 IP(例如:23.90.68.56)是否属于上述任何 CIDR。如果是,则我们获取该 CIDR 的输出。
根据上面的例子,输出应该是23.90.68.0/24
我尝试使用grepcidr但我不知道如何输出特定的 CIDR
我正在为此创建一个 bash 脚本,但有人能帮我处理这个输出吗?我尝试搜索网络,但没有找到任何相关信息
答案1
你可能拥有 Python:
#!/usr/bin/env python3
import argparse
import ipaddress
import sys
parser = argparse.ArgumentParser()
parser.add_argument("address")
args = parser.parse_args()
addr = ipaddress.ip_address(args.address)
for line in sys.stdin:
cidr = ipaddress.ip_network(line.strip())
if addr in cidr:
print(cidr)
exit(0)
exit(1)
答案2
可能的 shell 脚本:
#!/bin/bash
ip=$1
shift; shift
for net in "$@"
do
nmap -sL -n $net | grep -q $ip && echo $net
done
如果你需要文件中的 cidrs 列表,请使用./scriptname ip_to_be_checked $(cat filename)
。可能是猫的无用用途。
./cidr.sh 23.90.68.56 $(cat cidrs.txt)
答案3
在 python 中,这将是:
import socket
def is_ip_in_cidr(ip, cidr):
network, mask = cidr.split("/")
mask = int(mask)
ip_int = int.from_bytes(socket.inet_aton(ip), "big")
network_int = int.from_bytes(socket.inet_aton(network), "big")
network_mask = (0xFFFFFFFF << (32 - mask)) & 0xFFFFFFFF
return (ip_int & network_mask) == network_int
# Test the function with a sample IP address and CIDR
ip = "192.168.0.5"
cidr = "192.168.0.0/24"
if is_ip_in_cidr(ip, cidr):
print(f"{ip} is in {cidr}")
else:
print(f"{ip} is NOT in {cidr}")
如果您可以使用提供的列表作为固定集进行测试,如下所示:
import socket
def is_ip_in_cidr(ip, cidrs):
for cidr in cidrs:
network, mask = cidr.split("/")
mask = int(mask)
ip_int = int.from_bytes(socket.inet_aton(ip), "big")
network_int = int.from_bytes(socket.inet_aton(network), "big")
network_mask = (0xFFFFFFFF << (32 - mask)) & 0xFFFFFFFF
if (ip_int & network_mask) == network_int:
return True
return False
# Test the function with a sample IP address and list of CIDRs
ip = "192.168.0.5"
cidrs = ["1.10.10.0/24", "5.154.0.0/16", "5.181.219.0/24", "23.90.68.0/24", "31.40.214.0/24"]
if is_ip_in_cidr(ip, cidrs):
print(f"{ip} is in one of {cidrs}")
else:
print(f"{ip} is NOT in any of {cidrs}")
在 bash 中
#!/bin/bash
function is_ip_in_cidr {
local ip=$1
local cidr=$2
local network=$(echo $cidr | cut -d/ -f1)
local mask=$(echo $cidr | cut -d/ -f2)
local network_dec=$(echo $network | awk -F. '{printf("%d\n", ($1 * 256 + $2) * 256 + $3)}')
local ip_dec=$(echo $ip | awk -F. '{printf("%d\n", ($1 * 256 + $2) * 256 + $3)}')
local mask_dec=$((0xffffffff << (32 - $mask)))
if [[ $((ip_dec & mask_dec)) -eq $((network_dec & mask_dec)) ]]; then
echo "true"
else
echo "false"
fi
}
# Test the function with a sample IP address and CIDR
ip="192.168.0.5"
cidr="192.168.0.0/24"
if $(is_ip_in_cidr $ip $cidr); then
echo "$ip is in $cidr"
else
echo "$ip is NOT in $cidr"
fi