두 개의 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 주소에 "유효한" 범위와 "잘못된" 범위가 있다고 언급되어 있지만 특정 주소 범위의 유효성을 테스트하는 방법을 정의하지 않았습니다. 나는 이것이 질문의 범위를 벗어난 것 같아요.

그러면 주소를 범위의 낮은/높은 주소와 비교하는 방법이 남습니다. 마지막으로 세 개의 주소가 모두 10진수 값으로 변환됩니다. 그것은 정수입니다.

IPv4 점으로 구분된 쿼드 주소 문자열을 정수로 변환하는 내 bash 루틴은 다음과 같습니다.

#!/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보다 작거나 같으면 범위 내에 있는 것입니다.

관련 정보