栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

linux shell netmask2cdir和cdir2netmask中cidr到netmask转换器的解释

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux shell netmask2cdir和cdir2netmask中cidr到netmask转换器的解释

mask2cdr()

要从像这样的点十进制网络掩码中获取CIDR前缀,请执行以下操作:

255.255.192.0

您首先必须将四个八位位组转换为二进制,然后计算最高有效位(即前导位的数量):

11111111.11111111.11000000.00000000  # 18 ones = /18 in CIDR

此功能相当有创意。首先,我们剥离所有前导

255
八位位组(即二进制全为八位的八位位组)并将结果存储在变量中
x

local x=${1##*255.}

此步骤使用参数扩展,整个脚本非常依赖此参数。如果继续使用示例的网络掩码

255.255.192.0
,则现在具有以下值:

$1: 255.255.192.0$x: 192.0

接下来我们设置了三个变量:

$1
$2
,和
$3
。这些称为位置参数 ; 它们很像普通的命名变量,但是通常在将参数传递给脚本或函数时进行设置。我们可以直接使用来设置值
set --
,例如:

set -- foo bar  # $1 = foo, $2 = bar

与位置参数相比,我更喜欢使用命名变量,因为它使脚本更易于阅读和调试,但是最终结果是相同的。我们设置

$1
为:

0^^^128^192^224^240^248^252^254^

这实际上只是一个表,用于将某些十进制值转换为二进制并计算

1
位数。我们稍后会再讨论。

我们设置

$2

$(( (${#1} - ${#x})*2 ))

这称为算术扩展。它看起来很复杂,但实际上只是在计算

1
我们在第一个命令中剥离的位数。它分解为:

(number of chars in $1 - number of chars in $x) * 2

在我们的情况下可以解决

(13 - 5) * 2 = 16

我们剥离了两个八位位组,得到16。这很有意义。

我们设置

$3
为:

${x%%.*}

这是

$x
第一个
.
剥离后的所有值的值。在我们的情况下,这是
192

我们需要将此数字转换为二进制并计算其中的

1
位数,因此让我们回到“转换表”。我们可以将表格分为相等的块,每个块包含四个字符:

0^^^  128^  192^  224^  240^  248^  252^  254^

以二进制形式,以上数字为:

00000000 10000000 11000000 11100000 11110000 11111000 11111100 11111110# 0 ones 1 one    2 ones   3 ones   ...

如果我们从左数起,则表中的每个四个字符的块对应

1
于二进制的一个附加位。我们正在尝试进行转换
192
,因此让我们先从表的最右边
192
开始,然后将其存储在
x

x=${1%%$3*}

$x
现在的值

0^^^128^

其中包含两个四个字符的块或

1
二进制的两位。

现在,我们只需要将

1
255
八位字节的位(总共16个,存储在variable中
$2
)和
1
上一步中的位(总共2个)相加:

echo $(( $2 + (${#x}/4) ))

哪里

${#x}/4

是的字符数

$x
除以4,即中的四个字符的块数
$x

输出:

18

cdr2mask()

让我们继续运行前面的示例,该示例的CIDR前缀为

18

我们

set --
用来设置位置参数$ 1到$ 9:

$1: $(( 5 - ($1 / 8) ))  # 5 - (18 / 8) = 3 [integer math]$2: 255$3: 255$4: 255$5: 255$6: $(( (255 << (8 - ($1 % 8))) & 255 ))  # (255 << (8 - (18 % 8))) & 255 = 192$7: 0$8: 0$9: 0

让我们来看看用来设置公式

$1
$6
一点点接近。
$1
设定为:

$(( 5 - ($1 / 8) ))

网络掩码的CIDR前缀的最大和最小值为32

11111111.11111111.11111111.11111111

子网掩码为0

00000000.00000000.00000000.00000000

上面的公式使用整数除法,因此可能的结果为1到5:

5 - (32 / 8) = 15 - ( 0 / 8) = 5

$6
设定为:

$(( (255 << (8 - ($1 % 8))) & 255 ))

让我们针对示例CIDR前缀进行细分

18
。首先,我们取模数并做一些减法:

8 - (18 % 8) = 6

接下来,我们按此值将255按位移位:

255 << 6

这与将6

0
位二进制数推入255的末尾相同:

11111111000000

最后,我们将该值与255按位与:

11111111000000 &00000011111111  # 255

这使

00000011000000

或简单地

11000000

看起来熟悉?这是二进制格式的网络掩码中的第三个八位位组:

11111111.11111111.11000000.00000000       ^------^

以十进制表示的值是192。

接下来,我们根据的值移动位置参数

$1

[ $1 -gt 1 ] && shift $1 || shift

在我们的例子中,值

$1
是3,因此我们将位置参数3向左移动。的先前值
$4
成为的新值
$1
,的先前值
$5
成为的值
$2
,依此类推:

$1: 255$2: 255$3: 192$4: 0$5: 0$6: 0

这些值应该看起来很熟悉:它们是我们的网络掩码中的十进制八位字节(最后加上两个额外的零)。要获得网络掩码,我们只需将前四个点之间的点打印出来即可:

echo ${1-0}.${2-0}.${3-0}.${4-0}

-0
每个参数后表示使用
0
作为默认值,如果参数没有设置。

输出:

255.255.192.0


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/408900.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号