给定 IP 地址和网络掩码,如何使用 bash 计算子网范围



在bash脚本中,我有一个像140.179.220.200这样的IP地址和一个像255.255.224.0这样的网络掩码。我现在要计算网络地址(140.179.192.000(,第一个可用主机IP(140.179.192.1(,最后一个可用主机IP(140.179.220.254(和广播地址(140.179.223.255(。我能够找到一种干净的方法来执行下面的网络地址。我能够手动进行子网计算,但主要是在将其转换为 bash 脚本时遇到困难。提前致谢

$ IFS=. read -r i1 i2 i3 i4 <<< "192.168.1.15"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.0.0"
$ printf "%d.%d.%d.%dn" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
192.168.0.0

计算网络并使用 bash 进行广播:

#!/bin/bash
ip=$1; mask=$2
IFS=. read -r i1 i2 i3 i4 <<< "$ip"
IFS=. read -r m1 m2 m3 m4 <<< "$mask"
echo "network:   $((i1 & m1)).$((i2 & m2)).$((i3 & m3)).$((i4 & m4))"
echo "broadcast: $((i1 & m1 | 255-m1)).$((i2 & m2 | 255-m2)).$((i3 & m3 | 255-m3)).$((i4 & m4 | 255-m4))"
echo "first IP:  $((i1 & m1)).$((i2 & m2)).$((i3 & m3)).$(((i4 & m4)+1))"
echo "last IP:   $((i1 & m1 | 255-m1)).$((i2 & m2 | 255-m2)).$((i3 & m3 | 255-m3)).$(((i4 & m4 | 255-m4)-1))"

示例:./script.sh 140.179.220.200 255.255.224.0

输出:

网络:140.179.192.0广播:140.179.223.255第一个 IP:140.179.192.1最后一个 IP:140.179.223.254
  • IP 和掩码之间的按位 AND 提供网络地址。
  • 网络地址和反相掩码之间的按位 OR 提供广播地址。

安装 ipcalc 并:

ipcalc 140.179.220.200/255.255.224.0
<</div> div class="one_answers">

也许这显然是你正在寻找的bash脚本(学校练习?(,但如果不是,有一个名为ipcalc的Linux软件包可以做到这一点:

$ ipcalc 140.179.220.200 255.255.224.0
Address:   140.179.220.200      10001100.10110011.110 11100.11001000
Netmask:   255.255.224.0 = 19   11111111.11111111.111 00000.00000000
Wildcard:  0.0.31.255           00000000.00000000.000 11111.11111111
=>
Network:   140.179.192.0/19     10001100.10110011.110 00000.00000000
HostMin:   140.179.192.1        10001100.10110011.110 00000.00000001
HostMax:   140.179.223.254      10001100.10110011.110 11111.11111110
Broadcast: 140.179.223.255      10001100.10110011.110 11111.11111111
Hosts/Net: 8190                  Class B

您可以首选表单ipcalc 140.179.220.200/19

好吧,您已经有了网络地址。第一个主机地址仅比网络地址高一个,这很容易计算,因为您知道低位为零(因此不会溢出到高字节......

然后是广播地址。这只是所有主机地址位设置为 1 的地址。这些是子网掩码为零的位。因此,要获取广播地址,请反转掩码并执行按位or。最后一个主机地址只比这少一个。

Bash的算术支持与C和大多数其他语言相同的按位运算符,因此&用于and|用于or^用于异或,~用于否定。从您已经拥有的东西中,您应该能够产生缺失的。

(是的,用shell这样做似乎有点令人讨厌,但是如果你要手动实现计算,在任何编程语言中它几乎都是相同的。

最新更新