Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定IP地址和网络掩码,如何使用bash计算子网范围?_Bash_Ip_Subnet_Netmask - Fatal编程技术网

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

给定IP地址和网络掩码,如何使用bash计算子网范围?,bash,ip,subnet,netmask,Bash,Ip,Subnet,Netmask,在bash脚本中,我的IP地址为140.179.220.200,网络掩码为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 <<<

在bash脚本中,我的IP地址为140.179.220.200,网络掩码为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
$IFS=。读取-r i1 i2 i3 i4安装ipcalc并:

ipcalc 140.179.220.200/255.255.224.0

也许这就是您正在寻找的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

使用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))"
  • IP和掩码之间的位AND表示网络地址
  • 网络地址和反转掩码之间的按位OR表示广播地址

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

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

Bash支持与C和大多数其他语言相同的位运算符,因此
&
支持
|
支持
^
支持异或,而
~
支持求反。从你已经拥有的,你应该能够产生丢失的


(是的,在shell中这样做似乎有点麻烦,但是如果要手动实现计算,在任何编程语言中都几乎是一样的。)

这里有什么问题?看起来你得到了预期的结果。我目前只能用上面的代码获取网络地址。我只是不知道如何修改它以获得我想要的其他结果。老实说,我不会在shell中费心这么做。使用一种语言(比如Python),它有一个用于这种地址操作的库(
ipaddress
)。谢谢@chepner,这是一个学校练习,但Python也是一个选项。我只是对这门语言不太熟悉,所以我没有研究它。我可能会转而使用python,它可能比任何
bash
hackery都要好一百万倍。如果RedHat网络配置脚本是一个例子,那么要正确完成这项工作需要大量的代码。是的,这是一个残酷的学校练习,谢谢你的想法,正如我所想:)堆栈溢出的心态不是要求人们为他们写代码,所以我不想做你的家庭作业。。。如果您不知道从何处开始将其转换为bash脚本,请从添加
#开始/bin/bash
在文件顶部,将其转换为可执行文件,并使用
$@
操作符获取脚本命令行参数(IP地址和掩码)。感谢您的响应!这正是我最终要做的,我只是在概念上把它分解,然后我就明白了。 network: 140.179.192.0 broadcast: 140.179.223.255 first IP: 140.179.192.1 last IP: 140.179.223.254