谁能指导我如何使用 shell 脚本修改 IP 地址中的前两个八位字节?
我试图修改这段代码,但没有奏效。任何指导或帮助将不胜感激。
此示例将替换最后一个八位字节:
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\}
) 至少一个数字 ( \+
) 后跟一个点。第二个子表达式匹配介于它和行尾 ( $
) 之间的任何内容。
由于我们对 不感兴趣\1
,因此无需提及。我们用我们固定的高阶字节表示来替换它$bytes12
。最后一个 to 字节预计包含在 中\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;