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

おすすめ記事