如何从Linux命令行生成随机MAC地址?
我寻找一种仅需要Linux命令行上常见的标准工具的解决方案。
MAC地址将用于来宾KVM。
如何从Linux命令行生成随机MAC地址?
我寻找一种仅需要Linux命令行上常见的标准工具的解决方案。
MAC地址将用于来宾KVM。
Answers:
我用
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
与完全随机数相比,此方法的好处是可以根据计算机的FQDN可靠地重现MAC地址,我有时发现这很有用。第02
一个八位位组的只是设置“本地分配”位,这很明显它不是供应商提供的MAC地址,并保证您不会与实际NIC的MAC地址冲突。
如果您需要为每个主机生成多个MAC地址,则可以将FQDN与将接口连接到的网桥的名称连接起来。这很好地将内容分发给了不同的NIC。
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
发布的脚本很好,但我想添加一个警告:注意生日(悖论)!
这是因为即使您只有23个人,他们中有2个人在同一天生日的可能性已经是50%。
这取决于您的方案,如何使用它,但是如果您随机生成MACS,则在大约一百万的情况下,mac数冲突的几率是40%,而在200万的情况下,这已经是87%!
如果您只需要几个,就可以了,但是当您维护一个拥有数百台服务器的服务器场时,每个服务器都托管着数十个虚拟机,或者如果您将macs用作某些数据库的索引来进行簿记,则需要特别注意!
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
这些变体也可以工作。
更长:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
或更短:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
根据随时间的快速测量,两个变体的负载消耗非常相似。
fold -w2|paste -sd: -
代替sed
。该sed
解决方案使用更熟悉的工具可能更容易记住-尽管我从他/她的回答中学到了更多。
ec
是二进制的11101100 ...
我知道这篇文章很老,但是对于将来的访问者来说,如果您想要一个加密安全的伪随机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'
这是其他五个选项,所有这些选项都使用随机位表示最高有效字节的最低有效位,以指示该地址是单播还是多播,以及最高有效字节的第二低有效位,用于指示该地址是否为单播或多播。普遍或局部管理。
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发行版不附带。在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
。
我用:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
只是为了好玩,这是一个纯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提取字符的值:
如果前导字符是单引号或双引号,则该值应是单引号或双引号后面字符的基础代码集中的数值。