最小のLinuxインストールでは、bashまたはperlを使用して、2つのIPアドレスが特定の範囲内にあることを確認したいと思います。
私はうまく機能するbashスクリプトを見つけましたが、実際には範囲内のすべてのIPアドレスを印刷したので、より大きな範囲を完了するのに時間がかかりました。私はすべての個々のIPアドレスを印刷することに興味はありませんが、与えられた2つの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)
Next 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アドレスに「有効な」範囲と「間違った」範囲があると述べていますが、特定のアドレス範囲の有効性をテストする方法を定義していませんでした。私はこれが質問の範囲外であると思います。
これにより、アドレスを範囲の低/高アドレスと比較する方法が残ります。最後に、3つのアドレスはすべて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以下であれば、範囲内にあります。