Shell脚本之IP验证
  TEZNKK3IfmPf 2023年11月13日 22 0

一、需求说明

  我们在编写网络相关脚本的时候,尝尝会遇到需要判断IP地址是否合法的问题,需要知道输入的IP地址是否为一个正确的IP地址。又或者我们需要知道IP地址是公网IP地址还是私网IP地址。此博文就是为了满足这个需求而编写,用于验证输入的IP地址是否合法,入IP地址格式错误返回1,输入正确可用IP(公网、私网)返回0,输入环回口IP、组播IP等返回2。输入常见的特殊IP地址也会告知验证结果。关于IP地址的介绍见博文TCP/IP之IP协议及IP地址详解。

二、脚本内容

#!/bin/bash
#script name: ipcheck.sh
#author: wuhs
#version: v1
#date: 2022-05-18
#description: 此脚本用于验证输入IP地址是否为有效IP地址
#description: 输入IP地址格式错误返回1,输入正确可用IP(公网、私网)返回0,输入环回口IP、组播IP等返回2

#函数定义
function ipcheck(){
  local IP=$1
  VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
  if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null;then
    if [[ $VALID_CHECK = "yes" ]];then
      echo "$IP 满足IP格式数字要求"
      p1=$(echo $IP|cut -d. -f1)
      p2=$(echo $IP|cut -d. -f2)
      p3=$(echo $IP|cut -d. -f3)
      p4=$(echo $IP|cut -d. -f4)
      if [ $p1 == 127 ];then
        echo "$IP 是一个环回口地址"
        return 2
      elif [ $p1==169 -a $p2 == 254 ];then
        echo "$IP 是一个自动专用IP地址,window终端在DHCP获取地址失败时分配的地址"
        return 2
      elif [ $p1 == 0 -a $p2 == 0 -a $p3 == 0 -a $p4 == 0 ];then
        echo "$IP 表示任意地址,用于配置默认路由"
        return 2
      elif [ $p1 == 255 -a $p2 == 255 -a $p3 == 255 -a $p4 == 255 ];then
        echo "$IP 表示限制广播地址"
        return 2
      elif [ $p1 -ge 224 -a $p1 -le 239 ];then
        echo "$IP 是一个D类地址,用于组播"
        return 2
      elif [ $p1 -ge 240 -a $p1 -le 247 ];then
        echo "$IP 是一个E类地址,属于实验室保留地址"
        return 2
      elif [ $p1 == 0 -a $p4 == 255 ];then
        echo "$IP 可能是一个反向掩码"
        return 2
      elif [ $p1 == 10 ];then
        echo "$IP 是一个私网IP地址"
        return 0
      elif [ $p1 == 172 -a $p2 -ge 16 -a $p2 -le 31 ];then
        echo "$IP 是一个私网IP地址"
        return 0
      elif [ $p1 == 192 -a $p2 == 168 ];then
        echo "$IP 是一个私网IP地址"
        return 0
      elif [ $p1 != 0 ];then
        echo "$IP 是一个公网IP地址"
        return 0
      else
        echo "$IP 无效!"
        return 1
      fi
    else
      echo "$IP 无效,请检查并重新输入!"
      return 1
    fi
  else
    echo "格式错误,请重新输入!"
    return 1
  fi
}

#带IP参数执行脚本则执行检查参数IP是否正确,否则弹窗要求出入IP
if [ $# == 0 ]; then
  while true;
  do
    read -p "请输入待检查IP: " IP
    ipcheck $IP
    [ $? -ne 1 ] && break || continue
  done
else
  ipcheck $1
fi

三、使用示例

1、无参数执行脚本

Shell脚本之IP验证

[root@s146 ipcheck]# ./ipcheck.sh
请输入待检查IP: a.b.c.c
格式错误,请重新输入!
请输入待检查IP: 100.200.300.400
100.200.300.400 无效,请检查并重新输入!
请输入待检查IP: 1.1.1.1
1.1.1.1 满足IP格式数字要求
1.1.1.1 是一个公网IP地址

2、带参数执行脚本

[root@s146 ipcheck]# ./ipcheck.sh 2.2.2.2
2.2.2.2 满足IP格式数字要求
2.2.2.2 是一个公网IP地址

3、验证环回口IP

[root@s146 ipcheck]# ./ipcheck.sh 127.0.0.3
127.0.0.3 满足IP格式数字要求
127.0.0.3 是一个环回口地址
[root@s146 ipcheck]# ./ipcheck.sh 127.0.0.253
127.0.0.253 满足IP格式数字要求
127.0.0.253 是一个环回口地址

4、验证window自动专用IP

[root@s146 ipcheck]# ./ipcheck.sh 169.254.1.1
169.254.1.1 满足IP格式数字要求
169.254.1.1 是一个自动专用IP地址,window终端在DHCP获取地址失败时分配的地址

5、验证私网IP

[root@s146 ipcheck]# ./ipcheck.sh 10.20.30.40
10.20.30.40 满足IP格式数字要求
10.20.30.40 是一个私网IP地址
[root@s146 ipcheck]# ./ipcheck.sh 172.16.100.1
172.16.100.1 满足IP格式数字要求
172.16.100.1 是一个私网IP地址
[root@s146 ipcheck]# ./ipcheck.sh 192.168.200.100
192.168.200.100 满足IP格式数字要求
192.168.200.100 是一个私网IP地址

6、验证组播IP

[root@s146 ipcheck]# ./ipcheck.sh 224.0.0.5
224.0.0.5 满足IP格式数字要求
224.0.0.5 是一个D类地址,用于组播
[root@s146 ipcheck]# ./ipcheck.sh 224.0.0.6
224.0.0.6 满足IP格式数字要求
224.0.0.6 是一个D类地址,用于组播

7、其他特殊IP地址验证

[root@s146 ipcheck]# ./ipcheck.sh 0.0.0.0
0.0.0.0 满足IP格式数字要求
0.0.0.0 表示任意地址,用于配置默认路由
[root@s146 ipcheck]# ./ipcheck.sh 255.255.255.255
255.255.255.255 满足IP格式数字要求
255.255.255.255 表示限制广播地址
[root@s146 ipcheck]# ./ipcheck.sh 0.0.0.255
0.0.0.255 满足IP格式数字要求
0.0.0.255 可能是一个反向掩码
[root@s146 ipcheck]# ./ipcheck.sh 247.1.2.3
247.1.2.3 满足IP格式数字要求
247.1.2.3 是一个E类地址,属于实验室保留地址
[root@s146 ipcheck]# ./ipcheck.sh 0.0.10.2
0.0.10.2 满足IP格式数字要求
0.0.10.2 无效!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年04月12日   36   0   0 shellbash
  TEZNKK3IfmPf   2024年05月31日   36   0   0 遍历shell
  TEZNKK3IfmPf   2024年04月19日   64   0   0 shellphp
  TEZNKK3IfmPf   19天前   26   0   0 shell
  TEZNKK3IfmPf   2024年05月31日   39   0   0 linuxshell
  TEZNKK3IfmPf   2024年03月29日   55   0   0 linuxIP
TEZNKK3IfmPf