Check for IP validity

后端 未结 13 1345
庸人自扰
庸人自扰 2020-12-05 07:13

How do I check the validity of an IP address in a shell script, that is within the range 0.0.0.0 to 255.255.255.255?

相关标签:
13条回答
  • 2020-12-05 07:33

    The typical solutions for this all seem to use regular expressions, but it occurs to me that it might be a better approach to do something like:

    if echo "$ip" | { IFS=. read a b c d e;
        test "$a" -ge 0 && test "$a" -le 255 &&
        test "$b" -ge 0 && test "$b" -le 255 &&
        test "$c" -ge 0 && test "$c" -le 255 &&
        test "$d" -ge 0 && test "$d" -le 255 &&
        test -z "$e"; }; then echo is valid; fi
    
    0 讨论(0)
  • 2020-12-05 07:34

    In the most simple form:-

    #!/bin/bash
    while true;
    do
    read -p "Enter a ip: " IP
    echo "${IP}" > ip.txt
    OCT1=$(cat ip.txt | awk -F "." '{print $1}')
    OCT2=$(cat ip.txt | awk -F "." '{print $2}')
    OCT3=$(cat ip.txt | awk -F "." '{print $3}')
    OCT4=$(cat ip.txt | awk -F "." '{print $4}')
    REGEX_IP='^[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}$'
    if [[ ${IP} =~ ${REGEX_IP} ]]
    then
        if [[ ${OCT1} -gt 255 || ${OCT2} -gt 255 || ${OCT3} -gt 255 || ${OCT4} -gt 255 ]]
            then
            echo "Please enter a valid ip"
            continue
            fi
    
    break
    else
            echo "Please enter a valid ip"
            continue
    fi
    done
    

    This will cover all the scenarios.

    0 讨论(0)
  • 2020-12-05 07:44

    You can just copy the following code and change body of if else control as per your need

    function checkIP(){
    echo "Checking IP Integrity"    
    ip=$1
    byte1=`echo "$ip"|xargs|cut -d "." -f1`
    byte2=`echo "$ip"|xargs|cut -d "." -f2`
    byte3=`echo "$ip"|xargs|cut -d "." -f3`
    byte4=`echo "$ip"|xargs|cut -d "." -f4`
    
    
    if [[  $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$  && $byte1 -ge 0 && $byte1 -le 255 && $byte2 -ge 0 && $byte2 -le 255 && $byte3 -ge 0 && $byte3 -le 255 && $byte4 -ge 0 && $byte4 -le 255 ]]
    then
        echo "IP is correct"
    else
        echo "This Doesn't look like a valid IP Address : $ip" 
    fi
    }
    checkIP $myIP 
    

    Calling the method with IP Address stored in a variable named myIP.

    $ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ - This part makes sure that IP consists of 4 blocks separated by a dot(.) but every block here is allowed to range from 0 - 999

    Since desired range of every block would be 0 - 255, to make sure of that below line can be used.

    $byte1 -ge 0 && $byte1 -le 255 && $byte2 -ge 0 && $byte2 -le 255 && $byte3 -ge 0 && $byte3 -le 255 && $byte4 -ge 0 && $byte4 -le 255

    0 讨论(0)
  • 2020-12-05 07:44

    Alternate version that still does a thorough validation (meaning that it requires both a properly formatted IP address AND that each quadrant is within the range of allowed values aka 0-255). Works fine on GNU bash 4.4.20 (Linux Mint 19.3); no promises elsewhere but will prolly be fine as long as you have bash 4.

    The initial format check regex is borrowed from the shannonman / Mitch Frazier answer above; the rest is my own.

        function isValidIpAddr() {
            # return code only version
            local ipaddr="$1";
            [[ ! $ipaddr =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && return 1;
            for quad in $(echo "${ipaddr//./ }"); do
                (( $quad >= 0 && $quad <= 255 )) && continue;
                return 1;
            done
        }
        function validateIpAddr() {
            # return code + output version
            local ipaddr="$1";
            local errmsg="ERROR: $1 is not a valid IP address";
            [[ ! $ipaddr =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && echo "$errmsg" && return 1;
            for quad in $(echo "${ipaddr//./ }"); do
                (( $quad >= 0 && $quad <= 255 )) && continue;
                echo "$errmsg";
                return 1;
            done
            echo "SUCCESS: $1 is a valid IP address";
        }
    
        $ isValidIpAddr '192.168.0.1'
        $ echo "$?"
        0
    
        $ isValidIpAddr '192.168.0.256'
        $ echo "$?"
        1
    
        $ validateIpAddr '12.1.10.191'
        SUCCESS: 12.1.10.191 is a valid IP address
    
        $ validateIpAddr '1.1.1.127'
        SUCCESS: 1.1.1.127 is a valid IP address
    
        $ validateIpAddr '1.1.1.1337'
        ERROR: 1.1.1.1337 is not a valid IP address
    
    0 讨论(0)
  • 2020-12-05 07:49

    i tweaked all the codes and found this to be helpful.

    #!/bin/bash
    
    ip="256.10.10.100"
    
    if [[ "$ip" =~ (([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.([01]{,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]))$ ]]; then
      echo "success"
    else
      echo "fail"
    fi
    
    0 讨论(0)
  • 2020-12-05 07:53

    The script Validating an IP Address in a Bash Script by Mitch Frazier does what you want to do:

    function valid_ip()
    {
    local  ip=$1
    local  stat=1
    
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
    }
    
    0 讨论(0)
自定义标题
段落格式
字体
字号
代码语言
提交回复
热议问题