[ SPECIAL ]

Linux shell

シェルスクリプトでネットワークアドレスを計算する

2011/05/31 Tomohiro Kumagai

□ ネットワークアドレスやブロードキャストを計算する

Linux シェルスクリプトで、IP アドレスとサブネット(マスクビット)情報から、そのネットワークに該当するネットワークアドレスとブロードキャストアドレスとを計算して取得するスクリプトを作成してみました。

#!/bin/sh

# Usage: NETINFO=(`get_network "192.168.1.130" "28"`)
#
#  ${NETINFO[0]}: Network Address
#  ${NETINFO[1]}: Broadcast Address
#  ${NETINFO[2]}: Netmask

function get_network()
{
	local NETWORK=""
	local BROADCAST=""
	local NETMASK=""

	local IPADDR="$1"
	local MASKBIT="$2"

	local ip_array=(`echo "$IPADDR" | sed -e "s/\./ /g"`)
	local ip_index=0

	while [ $ip_index -lt 4 ]
	do
		if [ "$MASKBIT" -lt 8 ]
		then
			MASK=$((256-2**$((8-MASKBIT))))
			MASK_REV=$((~MASK%256+256))
			MASKBIT=0
		else
			MASK=255
			MASK_REV=0
			MASKBIT=$((MASKBIT - 8))
		fi


		NETWORK="${NETWORK}.$((ip_array[ip_index] & MASK))"
		BROADCAST="${BROADCAST}.$((ip_array[ip_index] | MASK_REV))"
		NETMASK="${NETMASK}.$MASK"

		ip_index=$((ip_index + 1))
	done

	NETWORK=`echo $NETWORK | sed -e "s/^\.//"`
	BROADCAST=`echo $BROADCAST | sed -e "s/^\.//"`
	NETMASK=`echo $NETMASK | sed -e "s/^\.//"`

	echo "$NETWORK $BROADCAST $NETMASK"
}

使い方としては、たとえば IP アドレス "192.168.1.130" と、サブネットマスクのマスクビット "28" を、上記で定義した "get_network" 関数の引数として、次のように渡します。

NETINFO=(`get_network "192.168.1.130" "28"`)

このようにすることで、その IP アドレスが所属するネットワークアドレスなどの情報が、次のように配列として取得できるようになります。

${NETINFO[0]} ネットワークアドレス
${NETINFO[1]} ブロードキャストアドレス
${NETINFO[2]} ネットマスク

これを用いることで、シェルスクリプトでネットワーク関連のちょっとした自動設定プログラムなどを作成することもしやすくなると思います。


 

カスタム検索

copyright © Tomohiro Kumagai @ EasyStyle G.K.
contact me: please from mail-form page.