站点图标 谷姐靓号网

写算法是真耗脑子-天权璇玑

Rate this post

帮 Louis.M.LX 弄机器,他买了个 akile.io 家的小鸡,纯 IPv6,无 IPv4 地址,而且 IPv6 是手动配置的,之前一键重装脚本代码里对纯 IPv6 静态的适配不太好,改了一下判断逻辑,把从系统里读取到的 IPv6,掩码,网关,和默认指定的 DNS 传过去就行了。

结果 Debian 安装程序读取了配置不成功,又爆红框,于是我开始查看填写的信息是哪出了问题。

分析 preseed.cfg 里的内容,我判断问题可能出在掩码上,Linux 里 IPv6 的掩码作为后缀,附加在 IPv6 地址后面,是 0-128 位的纯数字,我就是给的脚本里获取的这个后缀值,然后传递到 preseed 配置 IPv6 网关里,然后又看了一下 Debian 官方给的配置文件案例,看看填写格式是不是有问题。

https://www.debian.org/releases/stable/i386/apbs04.en.html

好家伙,官方给的配置案例里,IPv6 掩码是从后缀转换成的纯 IPv6 地址,而且它应该是不认那种纯数字后缀简写,报错的原因找到了,下面就是搞一种方式,能把转换完成。

找了半天,全网竟然没有一个用 shell 写的,能把 IPv6 0-128 位掩码转换成对应位数,算出对应的地址范围,然后取范围内首个 IPv6 地址,作为输入的掩码的工具,没办法,只好我自己写了。

计算原理还好比较简单,一个完整的 IPv6 地址一共有 32 个数,其中每个数都是 16 进制,0 1 2 3 4 5 6 7 8 9 a b c d e f,如果是满的 128 位,对应的掩码就是 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff,说明该范围内只有一个计算机能获得 IPv6 地址,每减少一位,范围扩大 2 倍,直到 2 的 128 次方,对应的范围里最小数就要往前挪相应的位数,以下是一个简单演示,到接近 0 的时候,由于包含的地址太多,所以仅展示对应范围里的第一个 IPv6 掩码:

    128:
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

    127:
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

    126:
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFC
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFD
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

    125:
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF8
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF9
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFA
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFB
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFC
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFD
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

    124:
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF0
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF1
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF2
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF3
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF4
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF5
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF6
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF7
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF8
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFF9
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFA
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFB
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFC
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFD
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

    ...........

    4:
    F000:0000:0000:0000:0000:0000:0000:0000

    3:
    E000:0000:0000:0000:0000:0000:0000:0000

    2:
    C000:0000:0000:0000:0000:0000:0000:0000

    1:
    8000:0000:0000:0000:0000:0000:0000:0000

    0:
    0000:0000:0000:0000:0000:0000:0000:0000

计算方法就是先用后缀与 4 相除,余数为 0,即正好除完,后缀就是 0,128 位后缀除外,余数为 1,后缀是 8,同理,余数 2,后缀 c,余数 3,后缀 e。

掩码计算简单的地方就是原后缀被 4 整除的结果,即 f 出现的次数。用循环把 f 都列出来。

然后把以上算出的,对应0 8 c e IPv6 后缀,直接拼在 f 后面即可。

除了 f 和拼接的 0 8 c e,剩下的值就全用 0 填充即可,需要填多少个 0 呢?用 32 减原后缀除 4 获得的整数部分即可。

最后得出来的纯字符不带冒号分割的 IPv6 地址如果超过 32 位,把多填充的最后一位 0 去掉即可。

然后把这段字符每 4 个隔开,然后用冒号填充,当然最后一个冒号也是要去掉的。

以下是实现代码:

随机输入一个结果,跟网站计算器里的结果交叉验证,结果相符。

如果说给一个死值,比如就 128 对应的 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff,或 64 对应的 ffff:ffff:ffff:ffff:0000:0000:0000:0000,好不好?当然好,给个死值不用费劲巴拉地算,也不用费这么多脑子去想算法,但我觉得不应该止步于此,如果实际环境中出现了别的后缀呢?96 位?84 位?如果给不对,网络配置不成功怎么办?人还是应该有点追求的。

计算 IPv6 是真的烦,求求以后别再出个 IPv8 了,但愿。

热议
推荐楼 antbt 前天23:12

你管这叫算法?

推荐楼 C₆H₁₂O₆

推荐楼 无神通

推荐楼 KDE 昨天10:06

搞这种 脱裤子放屁

直接内存系统DD官方镜像不香嘛

推荐楼 爱消失 昨天09:07

点进来还以为是啥吐槽二叉树或者排序之类的,emmmm,这个也可以称为算法没毛病。只是这个算法过于简单

推荐楼 tows3

推荐楼 ccloyc 前天23:55

为什么不是抄一个python或者其他语言写的然后用shell调用python

2楼 ALPP 前天21:25

溜啊!

3楼 mlcq 前天21:28

4楼 无神通 前天21:33

这难道不应该用位运算?

5楼 天权璇玑 前天21:34

这难道不应该用位运算?

不需要,ipv6 掩码计算原理还是比较简单的,我只要保证算出来的结果和网站计算器一样就行

6楼 奧巴马 前天21:43

,我写过python 和php的。好像没这么复杂吧!

8楼 腾讯云6折购 前天22:07

泰库辣 IPv8 pro plus max 在等你哦

9楼 acpp 前天22:10

记得这个有公式直接 128减去前缀长度

10楼 trips 前天22:11

一直觉得shell脚本写的牛逼的都是大佬

12楼 airport666 前天22:30

666

13楼 antbt 前天23:12

你管这叫算法?

14楼 机长 前天23:14

有ai 要啥脑子

15楼 谷歌浏览器 前天23:15

你需要一个copilot

16楼 abc.xyz 前天23:31

粗略看了下,这种活chatgpt应该最擅长吧。。。

17楼 天权璇玑 前天23:41

你管这叫算法?

没本事的人只会阴阳怪气

18楼 天权璇玑 前天23:42

你管这叫算法?

有本事的学学楼上,写个比我更牛批的,谁比我牛批我服谁,我不服嘴炮

19楼 Louis.M.LX 前天23:43

这件事情泰酷辣

20楼 StarkSands 前天23:49

有本事的学学楼上,写个比我更牛批的,谁比我牛批我服谁,我不服嘴炮

你会我不会的事情那都是牛逼。。。就这样。我不会

若你无力推倒这堵墙
那请别给加它一块砖。

22楼 ccloyc 前天23:55

为什么不是抄一个python或者其他语言写的然后用shell调用python

24楼 坏坏 昨天00:22

这太复杂了了,,,,,,,,,,,,,,,,

25楼 yanzhiling2002 昨天00:25

ipv4可以转换成十进制,相邻的ipv4转换成的十进制也是相邻的,大部分程序也能识别,比如cmd ping 2130706433

26楼 yizhuohao7 昨天00:56

用ChatGPT的话会快很多吧

27楼 爱消失 昨天09:07

点进来还以为是啥吐槽二叉树或者排序之类的,emmmm,这个也可以称为算法没毛病。只是这个算法过于简单

28楼 KDE 昨天10:06

搞这种 脱裤子放屁

直接内存系统DD官方镜像不香嘛

29楼 天权璇玑 昨天11:52

搞这种 脱裤子放屁

直接内存系统DD官方镜像不香嘛

DD官方镜像一我没精力做这种适配包,bios和uefi的各一种镜像,二我无力维护这种服务,三它对原环境的适配肯定没有我读取模板系统再写入新系统里那么方便,典型的就是bin456789的脚本,他在内存里启动一个微系统,把ubuntu iso镜像放到硬盘里装,cloud init配置文件只能写一套,ipv4 ipv6静态机器没法用,端口改不了,密码也改不了

30楼 KDE 4小时前

DD官方镜像一我没精力做这种适配包,bios和uefi的各一种镜像,二我无力维护这种服务,三它对原环境的适配 ...

不用适配 基本上都有官方小鸡镜像

https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-nocloud-amd64.raw

内存系统进去 DD到硬盘重读分区 挂载分区 修改密码就得了 多简单的一件事情 何必要写这么复杂的脚本

有空 研究新技术 或者陪陪女朋友**做的事情 不香吗

申明:本文内容由网友收集分享,仅供学习参考使用。如文中内容侵犯到您的利益,请在文章下方留言,本站会第一时间进行处理。

退出移动版