给定 IP 地址和网络掩码,如何使用 bash 计算子网范围?
Given IP address and Netmask, how can I calculate the subnet range using 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.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
192.168.0.0
安装 ipcalc 和:
ipcalc 140.179.220.200/255.255.224.0
也许这正是您正在寻找的 bash 脚本(学校练习?),但如果不是,则有一个 Linux 包,名为 ipcalc
这样做:
$ 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
计算网络并广播bash:
#!/bin/bash
ip=; mask=
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
输出:
network: 140.179.192.0
broadcast: 140.179.223.255
first IP: 140.179.192.1
last IP: 140.179.223.254
- IP 和掩码之间的按位与给出网络地址。
- 网络地址和反向掩码之间的按位或运算给出广播地址。
嗯,您已经有了网络地址。第一个主机地址只比网络地址高一个,这很容易计算,因为你知道低位是零(所以不会溢出到高字节...)
然后是广播地址。这只是所有主机地址位都设置为 1 的地址。这些是子网掩码为零的位。因此,要获得广播地址,请反转掩码并按位执行 or
。最后一个主机地址只差一个。
Bash 的 arithmetic 支持与 C 和大多数其他语言相同的按位运算符,因此 &
用于 and
,|
用于 or
、^
表示异或,~
表示否定。从你已经拥有的,你应该能够产生缺失的。
(是的,用 shell 做这件事似乎有点恶心,但如果你要手动实现计算,它在任何编程语言中都几乎相同。)
在 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.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
192.168.0.0
安装 ipcalc 和:
ipcalc 140.179.220.200/255.255.224.0
也许这正是您正在寻找的 bash 脚本(学校练习?),但如果不是,则有一个 Linux 包,名为 ipcalc
这样做:
$ 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
计算网络并广播bash:
#!/bin/bash
ip=; mask=
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
输出:
network: 140.179.192.0 broadcast: 140.179.223.255 first IP: 140.179.192.1 last IP: 140.179.223.254
- IP 和掩码之间的按位与给出网络地址。
- 网络地址和反向掩码之间的按位或运算给出广播地址。
嗯,您已经有了网络地址。第一个主机地址只比网络地址高一个,这很容易计算,因为你知道低位是零(所以不会溢出到高字节...)
然后是广播地址。这只是所有主机地址位都设置为 1 的地址。这些是子网掩码为零的位。因此,要获得广播地址,请反转掩码并按位执行 or
。最后一个主机地址只差一个。
Bash 的 arithmetic 支持与 C 和大多数其他语言相同的按位运算符,因此 &
用于 and
,|
用于 or
、^
表示异或,~
表示否定。从你已经拥有的,你应该能够产生缺失的。
(是的,用 shell 做这件事似乎有点恶心,但如果你要手动实现计算,它在任何编程语言中都几乎相同。)