我们知道我们可以使用MAC地址来创建接口标识符,例如,对于本地链路的IPv6地址,该标识符在网络中应该是唯一的。
该图显示了执行此操作的方法:
我的问题是:
- 如何使用
awk
或从MAC创建IPv6地址sed
? - 或者是否有任何命令可以为我提供特定MAC的链接本地IPv6地址(类似
createIPv6 myMAC
)?
我们知道我们可以使用MAC地址来创建接口标识符,例如,对于本地链路的IPv6地址,该标识符在网络中应该是唯一的。
该图显示了执行此操作的方法:
我的问题是:
awk
或从MAC创建IPv6地址sed
?createIPv6 myMAC
)?Answers:
如果要从MAC(和给定前缀)创建整个IPv6地址,则可以使用ipv6calc
Peter Bieringer 出色的工具。
以下命令fe80::
从MAC地址创建一个本地链接的IPv6地址(前缀):
$ ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr fe80:: 00:21:5b:f7:25:1b
fe80::221:5bff:fef7:251b
您可以保留大多数选项,并让命令猜测要怎么做:
$ ipv6calc --in prefix+mac fe80:: 00:21:5b:f7:25:1b
No action type specified, try autodetection...found type: prefixmac2ipv6
fe80::221:5bff:fef7:251b
对于Debian发行版,ipv6calc
位于主存储库中。
在IPv6 Wikipedia条目中,提供了更多文字说明:
64位接口标识符最通常是从其48位MAC地址派生的。
通过在中间的00:0C:29:FF:FE:0C:47:D5中插入FF:FE,将MAC地址00:0C:29:0C:47:D5转换为64位EUI-64。
因此,在更换第三:
与:FF:FE:
应该做的伎俩:
echo 00:0C:29:0C:47:D5 | sed s/:/:FF:FE:/3
00:0C:29:FF:FE:0C:47:D5
不知道该语法是否特定于GNU sed。
工作正在进行中:
将其转换为位:
for HEX in $(tr ":" " " <<< 00:0C:29:FF:FE:0C:47:D5)
do
printf "%08d " $(bc <<< "ibase=16;obase=2;$HEX")
done
应该导致这些位00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101
只留下第7位的翻转。
我必须对上面的@ rubo77表示敬意,以获取上面我想要的纯壳(除非您算上printf)答案。
这为以下操作添加了sed:
(a)在每个16位块中消除所有前导零;和
(b)在IID的开头删除所有其他全零块
...根据地址简洁的常见约定。
mac_to_eui64() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}
请注意,如果您希望将其重新设置为其他(任意)前缀,则可以使用EUI-64,因为EUI-64可以在任何范围内使用(尽管出于隐私原因,建议不要将其用于全局地址),但您需要更复杂的sed脚本。这是因为该fe80::
前缀已经包含三个零块(消除到双冒号),这些零块与IID的开头相邻。因此,即使IID的第一个块为全零(即,MAC以开头02:00
),也将被忽略。EUI-64格式仅剩下一个可能为全零的块-最后一个-上面的脚本将其加回为单个零。其他前缀可能需要一个在两个冒号之间留下单个零。
printf
独自离开了@ rubo77的罚款,而是在sed中做了其他工作。