Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash检查CIDR地址是否有效_Regex_Bash_Validation_Cidr - Fatal编程技术网

Regex Bash检查CIDR地址是否有效

Regex Bash检查CIDR地址是否有效,regex,bash,validation,cidr,Regex,Bash,Validation,Cidr,我就是不知道该怎么办。 我有一个正则表达式来检查字符串是否包含有效的CIDR表示法地址 (((?:25[012345]| 2[0-4]\d | 1?\d?){3}((?:25[012345]| 2[0-4]\d | 1?\d?)(?:\/([1-9]|[1-2][0-9]| 3[0-2])(?![\d]) 这个东西在Perl、PHP、Javascript中工作,并将x.x.x.x/8匹配到y.y.y/32 我已尝试将这些\d更改为[[:digit:]和\\d无:( 用于测试的测试脚本: #!/b

我就是不知道该怎么办。 我有一个正则表达式来检查字符串是否包含有效的CIDR表示法地址

(((?:25[012345]| 2[0-4]\d | 1?\d?){3}((?:25[012345]| 2[0-4]\d | 1?\d?)(?:\/([1-9]|[1-2][0-9]| 3[0-2])(?![\d])

这个东西在Perl、PHP、Javascript中工作,并将
x.x.x.x/8
匹配到
y.y.y/32

我已尝试将这些
\d
更改为
[[:digit:]
\\d
无:(

用于测试的测试脚本:

#!/bin/bash

if [ "$1" = "" ]
then
    echo "Usage: $( basename $0) 123.456.789.0/12"
    exit
fi
REGEX1='(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])'
REGEX2='(((?:25[012345]|2[0-4]\\d|1?\\d\\d?)\.){3}(?:25[012345]|2[0-4]\\d|1?\\d\\d?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\\d])'
REGEX3='(((?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\\.){3}(?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.[[:digit:]]])'

REGEX=$REGEX3

if [[ $1 =~ $REGEX ]]
then
    echo "$1 OK!"
else
    echo "$1 Not OK! $REGEX"
fi
你有什么想法吗

已更新。添加了工作脚本:

#!/bin/bash

if [ "$1" = "" ]
then
    echo "Usage: $( basename $0) 123.456.789.0/12"
    exit
fi

REGEX='(((25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?))(\/([8-9]|[1-2][0-9]|3[0-2]))([^0-9.]|$)'

if [[ $1 =~ $REGEX ]]
then
    echo "$1 OK!"
else
    echo "$1 Not OK!"
fi

if echo $1 | grep -Pq $REGEX
then
    echo "grep $1 OK!"
else
    echo "grep $1 Not OK!"
fi

通往成功的最短路径是GNU grep,它还支持PCRE:

if echo $CIDR | grep -qP "$REGEX"
then
  echo "$CIDR OK!"
  exit 0
else
  echo "$CIDR NOT OK!"
  exit 1
fi
grep的
-q
使其保持沉默,并依赖退出代码来确定成功。
-p
是PCRE

但我应该指出,您的正则表达式并不完全匹配某个内容是有效的CIDR范围;相反,您匹配的是一个有效的IP地址,后跟一个斜杠和一个数字n∈ 1-32.CIDR范围的另一个要求是地址的32-n低位为零,例如:

IFS="./" read -r ip1 ip2 ip3 ip4 N <<< $CIDR
ip=$(($ip1 * 256 ** 3 + $ip2 * 256 ** 2 + $ip3 * 256 + $ip4))

if [ $(($ip % 2**(32-$N))) = 0 ]
then
  echo "$CIDR OK!"
  exit 0
else
  echo "$CIDR NOT OK!"
  exit 1
fi

IFS=“./”read-r ip1 ip2 ip3 ip4 N通往成功的最短路径是GNU grep,它也支持PCRE:

if echo $CIDR | grep -qP "$REGEX"
then
  echo "$CIDR OK!"
  exit 0
else
  echo "$CIDR NOT OK!"
  exit 1
fi
grep的
-q
使其保持沉默,并依赖退出代码来确定成功。
-p
是PCRE

但我应该指出,您的正则表达式并不完全匹配某个内容是有效的CIDR范围;相反,您匹配的是一个有效的IP地址,后跟一个斜杠和一个数字n∈ 1-32.CIDR范围的另一个要求是地址的32-n低位为零,例如:

IFS="./" read -r ip1 ip2 ip3 ip4 N <<< $CIDR
ip=$(($ip1 * 256 ** 3 + $ip2 * 256 ** 2 + $ip3 * 256 + $ip4))

if [ $(($ip % 2**(32-$N))) = 0 ]
then
  echo "$CIDR OK!"
  exit 0
else
  echo "$CIDR NOT OK!"
  exit 1
fi

IFS=“./”读-r ip1 ip2 ip3 ip4 NSimon的解决方案很优雅:

我不太喜欢用复杂的正则表达式来验证那些有意义的东西,而这些东西应该用其他方式来解释。因此,或者,如果您更喜欢用字符串操作而不是数学来实现这一点,我不久前编写了以下函数:

valid_cidr_network() {
  local ip="${1%/*}"    # strip bits to leave ip address
  local bits="${1#*/}"  # strip ip address to leave bits
  local IFS=.; local -a a=($ip)

  # Sanity checks (only simple regexes)
  [[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
  [[ $bits =~ ^[0-9]+$ ]] || return 1
  [[ $bits -gt 32 ]] || return 1

  # Create an array of 8-digit binary numbers from 0 to 255
  local -a binary=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
  local binip=""

  # Test and append values of quads
  for quad in {0..3}; do
    [[ "${a[$quad]}" -gt 255 ]] && return 1
    printf -v binip '%s%s' "$binip" "${binary[${a[$quad]}]}"
  done

  # Fail if any bits are set in the host portion
  [[ ${binip:$bits} = *1* ]] && return 1

  return 0
}

此函数以二进制形式组合IP地址,如果在IP地址的主机部分设置了任何“1”,则该函数将失败。

Simon的解决方案非常优雅。:)

我不太喜欢用复杂的正则表达式来验证那些有意义的东西,而这些东西应该用其他方式来解释。因此,或者,如果您更喜欢用字符串操作而不是数学来实现这一点,我不久前编写了以下函数:

valid_cidr_network() {
  local ip="${1%/*}"    # strip bits to leave ip address
  local bits="${1#*/}"  # strip ip address to leave bits
  local IFS=.; local -a a=($ip)

  # Sanity checks (only simple regexes)
  [[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
  [[ $bits =~ ^[0-9]+$ ]] || return 1
  [[ $bits -gt 32 ]] || return 1

  # Create an array of 8-digit binary numbers from 0 to 255
  local -a binary=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
  local binip=""

  # Test and append values of quads
  for quad in {0..3}; do
    [[ "${a[$quad]}" -gt 255 ]] && return 1
    printf -v binip '%s%s' "$binip" "${binary[${a[$quad]}]}"
  done

  # Fail if any bits are set in the host portion
  [[ ${binip:$bits} = *1* ]] && return 1

  return 0
}

此函数以二进制形式组合IP地址,如果在IP地址的主机部分设置了任何“1”,则会失败。

=~
使用扩展正则表达式,而不是与Perl兼容的正则表达式(PCRE)。如果您有GNU grep,则可以使用原始正则表达式,如果echo$1 | grep-Pq$REGEX
。如果你需要使用POSIX regex,那么如果你需要使用POSIX regex,那么非捕获捕获的组就不可用(<代码>(((((<代码>((<代码>(((<代码>(((((<代码>((((((((<代码>(((((<代码>)(:::::,,,,,,,,,,,,,,,,,,,,,,:::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)如果你)如果你需要你需要需要你需要你需要使用)如果你需要你需要需要需要使用)如果你需要使用。如果你需要使用这些。如果你需要使用。如果你需要使用这些。如果你需要你需要使用。如果你需要你需要使用。如果你需要使用。如果你需要使用这些非捕获伙计们。Matt Raines解决方案与grep合作。Revo的解决方案同时适用于
=~
和grep。
=~
使用扩展正则表达式,而不是与Perl兼容的正则表达式(PCRE)。如果您有GNU grep,您可以将原始正则表达式与
If echo$1 | grep-Pq$REGEX
一起使用。如果你需要使用POSIX regex,那么如果你需要使用POSIX regex,那么非捕获捕获的组就不可用(<代码>(((((<代码>((<代码>(((<代码>(((((<代码>((((((((<代码>(((((<代码>)(:::::,,,,,,,,,,,,,,,,,,,,,,:::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)如果你)如果你需要你需要需要你需要你需要使用)如果你需要你需要需要需要使用)如果你需要使用。如果你需要使用这些。如果你需要使用。如果你需要使用这些。如果你需要你需要使用。如果你需要你需要使用。如果你需要使用。如果你需要使用这些非捕获伙计们。Matt Raines解决方案与grep合作。Revo的解决方案同时适用于
=~
和grep。我明白你的意思。我处理的输入来自whois查询,所以我假设它是有效的CIDR。最后的输出是:
insert into blacklist.cidrlist(cidr,minip,maxip,minint,maxit,created)值('${cidr}','${minip}','${maxip}',inet_aton('${minip}'),inet_aton('${maxip}'),now())如果不需要验证CIDR范围,那么可能也不需要验证IP地址?如果从文件流中提取CIDR范围,请考虑<代码> GRP- Po(\ D+\){ 3 }\D+/\D++< /C>。我确信它不会包含误报,而且它肯定更适合一行。:-)我明白你的意思。我处理的输入来自whois查询,所以我假设它是有效的CIDR。最后的输出是:
insert into blacklist.cidrlist(cidr,minip,maxip,minint,maxit,created)值('${cidr}','${minip}','${maxip}',inet_aton('${minip}'),inet_aton('${maxip}'),now())如果不需要验证CIDR范围,那么可能也不需要验证IP地址?如果从文件流中提取CIDR范围,请考虑<代码> GRP- Po(\ D+\){ 3 }\D+/\D++< /C>。我确信它不会包含误报,而且它肯定更适合一行。:-)杰出的我喜欢我可以调整它,以完全注销CIDR输入的错误。非常好。我喜欢我可以调整它,以完全注销CIDR输入的错误。