检查IP有效性

Alw*_*ner 22 linux shell

如何检查shell脚本中的IP地址的有效性,这是该范围内0.0.0.0255.255.255.255

gho*_*oti 43

如果你正在使用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
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用POSIX shell,那么你可以使用exprBRE而不是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
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

或者甚至用更少的管道:

#!/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
Run Code Online (Sandbox Code Playgroud)

或者,如果您的shell是bash,如果您不喜欢算术,则可以使用繁琐的正则表达式进行四元验证:

#!/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
Run Code Online (Sandbox Code Playgroud)

这也可以用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 -a a=($ip)
  # Start with a regex format test
  [[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
  # Test values of quads
  local quad
  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
Run Code Online (Sandbox Code Playgroud)

有很多方法可以做到这一点.我给你看了几个.

  • @focorner,很高兴你喜欢它。:) 输入变量不会被修改,但是 `IFS=.` 会导致它以不同的方式*表达*。我怀疑这里最好的解决方案是在本地分配字段分隔符,因此“local IFS=.;”,这样更改就不会影响函数外部的行为。我在上面的脚本中进行了此更改;如果您仍然表现出相同的行为,请告诉我。 (2认同)
  • ghoti,你是对的:按照你的建议将 `IFS=.` 设置为函数内部的本地就可以了。谢谢。A+ (2认同)

Jon*_*Jon 9

这个单一的正则表达式应该只验证 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
Run Code Online (Sandbox Code Playgroud)


小智 8

使用ipcalc

$ ipcalc -cs 10.10.10.257 && echo vail_ip || echo invalid_ip
invalid_ip
Run Code Online (Sandbox Code Playgroud)

  • 在我的系统 (Debian Linux) 上不起作用,`-s` 参数需要一个参数,即使发生错误,返回码也显示为 0。 (2认同)

小智 6

Mitch Frazier的脚本“在Bash脚本中验证IP地址”完成了您想要做的事情:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 你一秒钟击败了我。另外,请务必检查底部的注释,其中有一些修订版本可以处理某些情况。 (2认同)