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


Answers:


46

我用

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

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

如果您需要为每个主机生成多个MAC地址,则可以将FQDN与将接口连接到的网桥的名称连接起来。这很好地将内容分发给了不同的NIC。


可重复性+1;对于某些应用,这使其成为一种非常优越的采矿方法。
MadHatter

非常感谢,我喜欢将其复制的想法。
ErikSjölund,2011年

另外,在极少数情况下,您会随机生成两次相同的mac,因此不会发生mac地址冲突
Petter H

3
作为替代,您可以使用tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha '16

1
从某种意义上说,它只是一种最终选择,与我的摘录所产生的结果完全不同...
womble

8

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

这是因为即使您只有23个人,他们中有2个人在同一天生日的可能性已经是50%。

这取决于您的方案,如何使用它,但是如果您随机生成MACS,则在大约一百万的情况下,mac数冲突的几率是40%,而在200万的情况下,这已经是87%!

如果您只需要几个,就可以了,但是当您维护一个拥有数百台服务器的服务器场时,每个服务器都托管着数十个虚拟机,或者如果您将macs用作某些数据库的索引来进行簿记,则需要特别注意!


感谢您对“生日悖论”的警告!以我为例,我将承担风险,因为我将生成大约20个MAC地址。
ErikSjölund2011年

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

1
这是因为即使您只有23个人,他们中有2个人在同一天生日的可能性已经是50%。 ”事实并非如此。23个人中的两个有大约50%的机会拥有相同的生日周年纪念日,而不是同一生日。
罗恩·莫平

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

啊,瑞士军用电锯又骑了。而通过版本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

谢谢MadHatter,我尝试了您的第二个变体,它成功了。非常好!
ErikSjölund,2011年

5

这些变体也可以工作。

更长:

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

或更短:

openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'

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


安东尼,您好,我在这里没有看到其他结合openssl rand和sed的变体,因此这是本主题中的独特解决方案。
Jaroslav Kucera

确实如此。他/她fold -w2|paste -sd: -代替sed。该sed解决方案使用更熟悉的工具可能更容易记住-尽管我从他/她的回答中学到了更多。
安东尼·G-莫妮卡的大法官

我认为第一个命令将不起作用,因为它没有将第一位设置为偶数!
amrx

@amrx,您好,您确定MAC的第一位必须为偶数吗?我的一台服务器中有网卡,其开头ec是二进制的11101100 ...
Jaroslav Kucera,

1
@JaroslavKucera,您好,单播MAC地址一定不要在第一个字节中设置1的位置位。那就是“组”(多播/广播)位。如果您组成自己的MAC地址,则应在第一个字节中设置2的位置位(“本地管理”位),以使其与保证的全局唯一MAC地址区分开。
amrx

4

我知道这篇文章很老,但是对于将来的访问者来说,如果您想要一个加密安全的伪随机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'

2

这是另一个基于wombie的答案:

macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr

不需要通过md5sum运行urandom输出。您可以按照Aaron Toponce的答案使用od。
womble

2

这是其他五个选项,所有这些选项都使用随机位表示最高有效字节的最低有效位,以指示该地址是单播还是多播,以及最高有效字节的第二低有效位,用于指示该地址是否为单播或多播。普遍或局部管理。

jot -w%02X -s: -r 6 1 256
openssl rand -hex 6|fold -w2|paste -sd: -
od -N6 -tx1 -An /dev/random|awk '$1=$1'|tr \  :
god -N6 -tx1 -An /dev/random|cut -c2-|tr \  :
hexdump -n6 -e'/1 ":%02X"' /dev/random|cut -c2-

jotOS X和BSD附带,但大多数Linux发行版不附带。在jot -w更改格式中,-s更改分隔符,并-r生成随机数。

od在POSIX中,但hexdump不是。

OS X od/usr/bin/od以下)使用与GNU不同的输出格式od

$ /usr/bin/od -N6 -tx1 -An /dev/random|tr ' ' :
:::::::::::d9::b9::d7::da::5f::96::::::::::::::::::::::::::::::::::::::::
$ god -N6 -tx1 -An /dev/random|tr ' ' :
:f5:6d:0a:3b:39:f9

在OS X中od,将输入文件的参数之后的选项视为输入文件的名称,因此Aaron Toponce回答中的命令将/dev/urandom无限期地使用OS X 读取od


1

您可以在$ FQDN之后添加$ RANDOM,这将在您每次运行它时为您提供随机的mac地址。这对于希望使用虚拟机快照或克隆创建备份虚拟机的人特别有用。

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

1
注意$ RANDOM在bash中可用,但在其他shell中可能不可用。
迈克尔·汉普顿


0

Python一线式:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'

0

只是为了好玩,这是一个纯bash版本,已针对Bash 4.4.12(1)-release测试:

read -N6 b </dev/urandom
LC_ALL=C printf "%02x:%02x:%02x:%02x:%02x:%02x\n" "'${b:0:1}" "'${b:1:1}" "'${b:2:1}" "'${b:3:1}" "'${b:4:1}" "'${b:5:1}"

第一行从中读取6个字符/dev/urandom;然后使用C字符集打印用冒号分隔的每个字符的0填充十六进制值(换行符是可选的,但对于打印出该值很有用)。

POSIX printf文档中定义了使用printf提取字符的值:

如果前导字符是单引号或双引号,则该值应是单引号或双引号后面字符的基础代码集中的数值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.