Como eu verifico se um endereço IP ou uma rede está contido em outra rede no Bash?

1

Preciso verificar se um endereço IP ou uma rede está contido em outra rede, por exemplo, se '10 .1.2.3 'estiver em '10 .0.0.0 / 8' ou se '10 .1.2.0 / 24 'estiver em '10 .0.0.0 / 8'. Atualmente eu uso o python para isso, por exemplo:

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

Existe uma maneira mais concisa / eficiente de fazer isso no Bash?

    
por Eugene Yarmash 31.01.2016 / 14:47

2 respostas

3

Aqui não há script bash tão conciso:

#!/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

Saída:

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
    
por 31.01.2016 / 20:55
1

Um script awk para fazer isso para um ip addr em uma rede. Eu acho que um pouco mais seria necessário para a rede em uma parte da rede.

ipcalc -b 10.0.0.0/8 |awk -f check_ip.awk  ip="10.1.2.3"
ip is in range

script -

{
 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"

   }
    
por 31.01.2016 / 18:25