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

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

我search一个只需要在Linux命令行中常见的标准工具的解决scheme。

MAC地址将用于来宾KVM。

我用

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

这种方法在完全随机数字上的好处是,可以根据机器的FQDN可靠地重现MAC地址,有时我觉得它很有用。 第一个八位字节的02只是设置了“本地分配”位,这使得显而易见的是它不是供应商提供的MAC地址,并且保证您不会与实际的NIC的MAC地址相冲突。

如果你需要为每个主机生成多个MAC地址,我用FQDN和网桥的名字连接起来, 这在为不同的NIC分发信息方面做得很好。

 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 

张贴的脚本是好的,但我想添加一个警告:注意生日(paradoxon)!

因为即使你只有23个人,也有2个人在同一天生日的机会已经是50%。

这取决于你的情况如何使用它,但是如果你随机生成MACS,大约有一百万次的MAC数量冲突的机会是200万的40%,已经是87%了!

如果你只需要一对夫妇,这是可以的,但是当你维护一个拥有数百台服务器的服务器场时,每台服务器上都有数十台虚拟机,或者如果你使用Mac作为索引在一些数据库中进行簿记,你需要小心!

我知道这篇文章是旧的,但对于未来的访问者,如果你想要一个密码安全的伪随机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' 

这是另外一个,基于wombie的回答:

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

这里有五个其他选项,所有这些选项都使用随机比特作为最高有效字节的最低有效位,指示该地址是单播还是多播,以及最高有效字节的次最低有效位是否表示地址是普遍或本地pipe理。

 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- 

jot附带OS X和BSD,但不适用于大多数Linux发行版。 在-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的input文件参数后面的od选项被视为input文件的名称,所以Aaron Toponce的答案中的命令无限期地从/dev/urandom读取OS X的od

这些变体也适用。

更长:

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

或更短:

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

随着时间的推移,两种变型的负载消耗非常相似。

对不起,不能发表这个作为评论,但使用Womble的方法生成随机mac地址,你可以在$ FQDN后面添加一个$(rand),这会给你随机的mac地址,每次你运行它。 这对想要使用快照或虚拟机克隆创build备份虚拟磁盘的人员特别有用。

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

编辑:根据Anubioz的评论,许多操作系统没有rand命令,所以编辑我的答案包括$ RANDOM而不是$(rand)。 谢谢!!

我用:

 echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'