IP 주소나 네트워크가 다른 네트워크에 포함되어 있는지 확인해야 합니다. 예를 들어 '10.1.2.3'이 '10.0.0.0/8'에 있는지, '10.1.2.0/24'가 '10.0.0.0/에 있는지 확인해야 합니다. 8' . 현재 저는 이를 달성하기 위해 Python을 사용합니다. 예를 들면 다음과 같습니다.
if [ $(python -c 'import ipaddress; print(ipaddress.ip_address("10.1.2.3") in ipaddress.ip_network("10.0.0.0/8"))') == "True" ]; then
echo "10.1.2.3 is in network 10.0.0.0/8"
fi
Bash에서 이 작업을 수행하는 더 간결하고 효율적인 방법이 있습니까?
답변1
덜 간결한 bash 스크립트는 다음과 같습니다.
#!/bin/bash
v4dec() {
for i; do
echo $i | {
IFS=./
read a b c d e
test -z "$e" && e=32
echo -n "$((a<<24|b<<16|c<<8|d)) $((-1<<(32-e))) "
}
done
}
v4test() {
v4dec $1 $2 | {
read addr1 mask1 addr2 mask2
if (( (addr1&mask2) == (addr2&mask2) && mask1 >= mask2 )); then
echo "$1 is in network $2"
else
echo "$1 is not in network $2"
fi
}
}
v4test 10.1.2.3 10.0.0.0/8
v4test 10.1.2.0/24 10.0.0.0/8
v4test 192.168.0.1 10.0.0.0/8
v4test 10.0.0.0/7 10.0.0.0/8
산출:
10.1.2.3 is in network 10.0.0.0/8
10.1.2.0/24 is in network 10.0.0.0/8
192.168.0.1 is not in network 10.0.0.0/8
10.0.0.0/7 is not in network 10.0.0.0/8
답변2
네트워크의 IP 주소에 대해 이 작업을 수행하는 awk 스크립트입니다. 네트워킹 부분은 네트워킹이 더 필요하다고 생각합니다.
ipcalc -b 10.0.0.0/8 |awk -f check_ip.awk ip="10.1.2.3"
ip is in range
스크립트 -
{
if ($1 == "HostMin:") {
split($2,add_min,".")
} else if ($1 == "HostMax:") {
split($2,add_max,".")
}
}
END{
split(ip, ip_addr, ".")
found = 1
for(i=1; i<=4; i++) {
if (ip_addr[i] < add_min[i] || ip_addr[i] > add_max[i]) {
found = 0
break
}
}
if (found)
print "ip is in range"
else
print "ip is Not in range"
}