IP 주소나 네트워크가 다른 네트워크에 포함되어 있는지 Bash에서 어떻게 확인합니까?

IP 주소나 네트워크가 다른 네트워크에 포함되어 있는지 Bash에서 어떻게 확인합니까?

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"

   }

관련 정보