检查两个IP地址是否在一个范围内

检查两个IP地址是否在一个范围内

在最小安装的 Linux 上使用 bash 或 perl,我尝试验证两个 IP 地址(如果它们在某个范围内)。

我遇到了一个运行良好的 bash 脚本,但事实上它打印了一个范围内的所有 IP 地址,因此需要更长的时间才能完成更大的范围。我对打印所有单独的 IP 地址不感兴趣,而只是检查两个给定的 IP 地址是否在一个范围内。怎样才能实现我的目标呢?

例子是

"1.1.1.1 - 1.1.1.10"  is correct (This a valid range)
"1.1.2.1 - 1.1.1.10"  is incorrect (This is NOT a valid range)

下面的 Bash 函数

#!/bin/bash
# convert IP to decimal
ip2dec() {
        set -- ${1//./ }     # split $1 with "." to $1 $2 $3 $4
        declare -i dec       # set integer attribute
        dec=$1*256*256*256+$2*256*256+$3*256+$4
        echo $dec
    }

# convert decimal to IP
dec2ip() {
        declare -i ip1 ip2 ip3 ip4
        ip1=$1/256/256/256
        ip2=($1-$ip1*256*256*256)/256/256
        ip3=($1-$ip1*256*256*256-$ip2*256*256)/256
        ip4=$1-$ip1*256*256*256-$ip2*256*256-$ip3*256
        echo $ip1.$ip2.$ip3.$ip4
        }

    start_ip=$(ip2dec $1)
    eend_ip=$(ip2dec $2)

    for ((i=$start_ip;i<=$end_ip;i++)); 
    do
    dec2ip $i
    done

脚本用法: ./script_name 1.1.1.1 1.1.1.10

答案1

在撰写本答案时,您的问题提到 IP 地址有“有效”范围和“无效”范围,但您尚未定义如何测试给定地址范围的有效性。我想这不在问题的范围内。

这就留给我们如何将地址与范围内的低/高地址进行比较。最后,所有这三个地址都转换为十进制值。即整数。

我自己的 bash 例程将 IPv4 点分四地址字符串转换为整数,如下所示:

#!/usr/bin/env bash

declare ip_int=0

ip2int () {
  local addr="$1"
  local ip IFS=.

  # use IFS to split dotted quad into array of octets
  # i.e., "10.200.251.22" => ( "10" "200" "251" "22" )
  ip=( ${addr} )

  # bit shift the octets and combine into integer via bitwise-or
  ip_int=$(( ip[0] << 24 | ip[1] << 16 | ip[2] << 8 | ip[3] ))
}

# get ip address as integer in $ip_int
ip2int 10.12.13.14

# show decimal and hex values, just for confirmation purposes
printf 'decimal: %d\n'   $ip_int
printf '    hex: %08x\n' $ip_int

如果将范围的整数值放入$start_ip/$end_ip并将当前地址的整数值放入$cur_ip,则测试地址是否在范围内是相当简单的一对比较:

[[ ${cur_ip} -ge ${start_ip} && ${cur_ip} -le ${end_ip} ]] && echo "In the address range"

即,如果当前地址等于或大于起始ip,并且等于或小于结束ip,则它在范围内。

相关内容