シェル スクリプトを使用して IP アドレスの最初の 2 オクテットを変更する方法を教えてもらえますか?
このコードを変更しようとしましたが、うまくいきませんでした。ガイダンスやヘルプをいただければ幸いです。
この例では、最後のオクテットを置き換えます。
cat test.sh
ip=$1
baseip=`echo $ip | cut -d"." -f1-3`
echo $baseip".0"
./test.sh 192.168.133.14
192.168.133.0
ip=$1
tailip=`echo $ip | cut -d"." -f3-4`
echo "x.x."$tailip
ip="10.1.2.3"
echo $ip | awk -F '.' '{printf("192.168.%d.%d", $3, $4)}'
Output: 192.168.2.3
bash の PE 機能を使用する良い方法:
ip="10.1.2.3"; tmpip="${ip#*.*.}"; echo "192.168.$tmpip"
また、生成される IP をランダム化できることにも注意してください。いくつかの一般的なアイデアを提供するだけです。
ip="10.1.2.3"; tmpip="${ip#*.*.}"; echo "$[RANDOM%256].$[RANDOM%256].$tmpip"
bytes12=10.0
ip=$(echo $1 | sed "s/\([0-9]\+\.\)\{2\}\(.*$\)/$bytes12.\2/")
sed:s/a/b/
aを見つけて、bに置き換えます。\(\)
によってアドレス指定されるサブ式をカプセル化し\1, \2, ...
ます。
最初の部分式は192.168.
、のようなシーケンスに一致します。つまり、2回(\{2\}
)少なくとも1桁(\+
)の後にドットが続きます。2番目の部分式は、それと行の終わり($
)の間にあるものと一致します。
興味が\1
ないので、言及する必要はありません。これを固定の上位バイト表現に置き換えます$bytes12
。最後のバイトは、に含まれると予想される\2
ため、追加するだけです。
INET_NTOA () {
local IFS=. num quad ip e
num=$1
for e in 3 2 1
do
(( quad = 256 ** e))
(( ip[3-e] = num / quad ))
(( num = num % quad ))
done
ip[3]=$num
echo "${ip[*]}"
}
INET_ATON () {
local IFS=. ip num e
ip=($1)
for e in 3 2 1
do
(( num += ip[3-e] * 256 ** e ))
done
(( num += ip[3] ))
echo "$num"
}
このタイプの機能を使用して、ファイアウォール ルールの有効化または無効化を自動化します。特に、ローカル ネットワーク上でのみ必要で、他の場所からはアクセスできないサービスに対して使用します。
これは、私が使用するサーバー インストール スクリプトのさまざまな部分からまとめたものです。ネットワーク インターフェイス名をプルし、ネットワークとマスク情報をプルし、それを解析して正しいマスクされたサブネットと CIDR 表記を提供します。このページをガイドとして使用して、今日の最後の部分を実際に追加しましたが、プロセスを完全に自動化します。
#!/bin/bash
subnetip=""
subnetmask=""
nicname=""
runme()
{
# pull name for primary network interface with internet access
nicname=$(ip route get 8.8.8.8 | awk '{print $5}')
# pull interface IP Address/subnet info assigned by DHCP
local subnetmasktemp=$(ip -o -f inet addr show $nicname | awk '{print $4}')
# split ip/subnet into two variables, subnetip and subnetmask
local IFS=/
set $subnetmasktemp
subnetip=$1
subnetmask=$2
# parse ipaddress and subnet info and output appropriate info for client subnet
local baseip=0
if [ "$subnetmask" -le 31 ] && [ "$subnetmask" -ge 24 ]; then
baseip=`echo $subnetip | cut -d"." -f1-3`
subnetip=($baseip".0")
elif [ "$subnetmask" -le 23 ] && [ "$subnetmask" -ge 16 ]; then
baseip=`echo $subnetip | cut -d"." -f1-2`
subnetip=($baseip".0.0")
elif [ "$subnetmask" -le 15 ] && [ "$subnetmask" -ge 8 ]; then
baseip=`echo $subnetip | cut -d"." -f1`
subnetip=($baseip".0.0.0")
fi
echo "$subnetip/$subnetmask"
}
runme;