리눅스 bash IP 유효성 검사

회사에서 업무상 bash 쉘 스크립트를 많이 만드는데, IP의 유효성을 검사하기 위해 대충 아래와 같은 함수를 만들어 보았다.

validate_IP(){
    if [[ $1 =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
    then
        for NUM in `sed 's/\./ /g' <<< $1`
        do
            if [ $NUM -ge 0 ] && [ $NUM -le 255 ]
            then
                continue
            else
                echo "Invalid"
                return 1
            fi
        done
        echo "Valid"
        return 0
    else
        echo "Invalid"
        return 1
    fi
}


그런데 위 함수에는 아래와 같은 문제가 있다.

[root@CentOS ~]# ./validate_IP.sh 172.16.8.128
Valid
[root@CentOS ~]# ./validate_IP.sh 172.16.256.128
Invalid
[root@CentOS ~]# ./validate_IP.sh 172.16.008.128
Valid


172.16.008.128에서 008은 올바른 IP 형식이 아니지만, 정규표현식 [0-9]{1,3} 조건도 만족하고, [ $NUM -ge 0 ] && [ $NUM -le 255 ] 조건도 만족하기 때문에 Valid로 나온다.

따라서 이 점을 보완해 아래와 같이 만들어 보았다.

validate_IP(){
    if [[ $1 =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
    then
        for NUM in `sed 's/\./ /g' <<< $1`
        do
            if [ $NUM -ge 0 ] && [ $NUM -le 255 ] && [[ ! $NUM =~ ^0[0-9]{1,2}$ ]]
            then
                continue
            else
                echo "Invalid"
                return 1
            fi
        done
        echo "Valid"
        return 0
    else
        echo "Invalid"
        return 1
    fi
}


이번에는 0으로 시작하는 경우 2자리나 3자리가 되지 않도록 처리하였다. 따라서 아래와 같이 172.16.008.128도 잘 잡아낼 수 있었다.

[root@CentOS ~]# ./validate_IP.sh 172.16.008.128
Invalid


그런데... 실컷 검증 스크립트를 짜놨더니 허탈한 일이 생겼다. 바로 ipcalc의 존재를 알아버렸다는...

레드햇 계열의 ipcalc는 -c 옵션으로 IP 형식의 유효성을 검증할 수 있다. 아무 말도 안 나오면 정상이고, 잘못된 IP를 넣으면 아래와 같이 에러를 출력한다.

[root@CentOS ~]# ipcalc -c 172.16.8.128
[root@CentOS ~]#
[root@CentOS ~]# ipcalc -c 172.16.256.128
ipcalc: bad IPv4 address: 172.16.256.128
[root@CentOS ~]#
[root@CentOS ~]# ipcalc -c 172.16.008.128
ipcalc: bad IPv4 address: 172.16.008.128


뭐 그래도 위 스크립트가 나름 도움이 되었기를 바라며...