如何从 Linux 命令行生成随机 MAC 地址

Eri*_*und 31 linux command-line-interface mac-address

如何从 Linux 命令行生成随机 MAC 地址?

我寻找一个只需要 Linux 命令行上常见的标准工具的解决方案。

MAC 地址将用于访客 KVM。

wom*_*ble 50

我用

macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Run Code Online (Sandbox Code Playgroud)

这种方法相对于完全随机数的好处是可以根据机器的 FQDN 可靠地重现 MAC 地址,我发现这有时很有用。第02一个八位字节只设置“本地分配”位,这很明显它不是供应商提供的 MAC 地址,并保证您不会与真实 NIC 的 MAC 地址发生冲突。

如果您需要为每个主机生成多个 MAC 地址,我曾经将 FQDN 与要连接接口的网桥名称连接起来;这很好地为不同的 NIC 传播了东西。

  • 作为替代方案,您可以使用 ```tr -dc A-F0-9 < /dev/urandom | 头-c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'``` (3认同)

flo*_*olo 8

发布的脚本很好,但我想添加一个警告:注意生日(悖论)!

这是因为即使你只有 23 个人,其中 2 个人在同一天过生日的几率已经是 50%。

这取决于您如何使用它的场景,但是如果您随机生成 MACS,那么大约 100 万个 mac 编号冲突的机会为 40%,200 万个已经是 87%!

如果您只需要几个,这没问题,但是当您维护一个包含数百台服务器的服务器群时,每个服务器都托管着数十台虚拟机,或者如果您使用 mac 作为某些数据库中的索引进行簿记,并且您需要唯一的服务器,请小心!

  • 如果您运行数百台服务器,每台服务器都在同一个广播域中托管数十台虚拟机,那么您会遇到比 MAC 地址冲突风险更大的问题。 (3认同)

小智 7

我知道这篇文章已经过时了,但对于未来的访问者来说,如果您想要一个加密安全的伪随机 MAC 地址,而不限于 0x02 作为 OUI,这里有一个快速且与平台无关的生成器:

$ printf '%02x' $((0x$(od /dev/urandom -N1 -t x1 -An | cut -c 2-) & 0xFE | 0x02)); od /dev/urandom -N5 -t x1 -An | sed 's/ /:/g'
Run Code Online (Sandbox Code Playgroud)


Jar*_*era 7

这些变体也有效。

更长:

openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
Run Code Online (Sandbox Code Playgroud)

或更短:

openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
Run Code Online (Sandbox Code Playgroud)

根据随时间的快速测量,两种变体的负载消耗非常相似。

  • @JaroslavKucera,您好,单播 MAC 地址绝不能在第一个字节中设置 1 位。这就是“组”(多播/广播)位。如果您编写自己的 MAC 地址,则应该在第一个字节中设置 2 的位置位(“本地管理”位),以将其与保证的全球唯一 MAC 地址区分开来。 (2认同)

Mad*_*ter 5

myserver% perl -e 'for ($i=0;$i<6;$i++){@m[$i]=int(rand(256));} printf "%X:%X:%X:%X:%X:%X\n",@m;'
55:C2:A5:FA:17:74
Run Code Online (Sandbox Code Playgroud)

啊,老瑞士军用电锯又骑了。通过 0.2 版,我毫不客气地窃取了 womble 关于第一个八位字节是 02 的精彩观点:

myserver% perl -e 'for ($i=0;$i<5;$i++){@m[$i]=int(rand(256));} printf "02:%X:%X:%X:%X:%X\n",@m;'
02:8E:94:A3:47:26
Run Code Online (Sandbox Code Playgroud)