检查IP有效性

如何检查shell脚本中IP地址的有效性,范围在0.0.0.0255.255.255.255

Solutions Collecting From Web of "检查IP有效性"

如果你正在使用bash,你可以为模式做一个简单的正则表达式匹配,而不需要验证四边形:

 #!/usr/bin/env bash ip=1.2.3.4 if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "success" else echo "fail" fi 

如果你坚持使用POSIX shell,那么你可以使用expr来做基本相同的事情,使用BRE而不是ERE:

 #!/bin/sh ip=1.2.3.4 if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then echo "success" else echo "fail" fi 

请注意, expr假定你的正则表达式是锚定在字符串的左边,所以最初的^是不必要的。

如果验证每个四元组小于256是很重要的,那么显然需要更多的代码:

 #!/bin/sh ip=${1:-1.2.3.4} if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then for i in 1 2 3 4; do if [ $(echo "$ip" | cut -d. -f$i) -gt 255 ]; then echo "fail ($ip)" exit 1 fi done echo "success ($ip)" exit 0 else echo "fail ($ip)" exit 1 fi 

或者甚至可以用更少的管道:

 #!/bin/sh ip=${1:-1.2.3.4} if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then IFS=. set $ip for quad in 1 2 3 4; do if eval [ \$$quad -gt 255 ]; then echo "fail ($ip)" exit 1 fi done echo "success ($ip)" exit 0 else echo "fail ($ip)" exit 1 fi 

或者,如果你的shell是bash,如果你不喜欢算术,你可以使用一个繁琐的正则表达式来进行quad验证:

 #!/usr/bin/env bash ip=${1:-1.2.3.4} re='^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}' re+='0*(1?[0-9]{1,2}|2([‌​0-4][0-9]|5[0-5]))$' if [[ $ip =~ $re ]]; then echo "success" else echo "fail" fi 

这也可以用BRE来表达,但是这比我的手指更能打字。

最后,如果你喜欢把这个功能放在一个函数中:

 #!/usr/bin/env bash ip=${1:-1.2.3.4} ipvalid() { # Set up local variables local ip=${1:-1.2.3.4} local IFS=.; local -aa=($ip) # Start with a regex format test [[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1 # Test values of quads for quad in {0..3}; do [[ "${a[$quad]}" -gt 255 ]] && return 1 done return 0 } if ipvalid "$ip"; then echo "success ($ip)" exit 0 else echo "fail ($ip)" exit 1 fi 

有很多方法可以做到这一点。 我已经向你展示了几个

我相信这个脚本做你想做的事情: http : //www.linuxjournal.com/content/validating-ip-address-bash-script

编辑,包括如下建议的代码:

 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 } 

使用ipcalc

 $ ipcalc -cs 10.10.10.257 && echo vail_ip || echo invalid_ip invalid_ip 

典型的解决方案似乎都使​​用正则表达式,但是对我来说这可能是一个更好的方法来执行如下操作:

 if echo "$ip" | { IFS=. read abcde; 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" \ 2> /dev/null; }; then echo is valid; fi 

我在下面找到了这个我觉得非常好用的代码。

 #!/bin/bash # Test an IP address for validity: # Usage: # valid_ip IP_ADDRESS # if [[ $? -eq 0 ]]; then echo good; else echo bad; fi # OR # if valid_ip IP_ADDRESS; then echo good; else echo bad; fi # 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 } 

我调整了所有的代码,发现这是有帮助的。

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

Perl有一个很好的模块Regexp :: Common来验证各种事情:

 perl -MRegexp::Common=net -e 'exit(shift() !~ /^$RE{net}{IPv4}$/)' $ipaddr 

你可能需要sudo cpan install Regexp::Common首先

我会把它包装在一个函数中:

 valid_ip() { perl -MRegexp::Common=net -e 'exit(shift() !~ /^$RE{net}{IPv4}$/)' "$1" } if valid_ip 123.234.345.456; then echo OK else echo INVALID fi 

这个正则表达式应该只验证0.0.0.0到255.255.255.255之间的地址:

 #!/bin/bash ip="1.2.3.4" if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then echo "success" else echo "fail" fi 
 #!/bin/bash read -p " ip: " req_ipadr # ip_full=$(echo $req_ipadr | sed -n 's/^\(\(\([1-9][0-9]\?\|[1][0-9]\{0,2\}\|[2][0-4][0-9]\|[2][5][0-4]\)\.\)\{3\}\([1-9][0-9]\?\|[1][0-9]\{0,2\}\|[2][0-4][0-9]\|[2][5][0-4]\)\)$/\1/p') # [ "$ip_full" != "" ] && echo "$req_ipadr vaild ip" || echo "$req_ipadr invaild ip"