我需要使用bash随机mac地址生成而不使用macchanger或类似的。
我有这个:
ObservableCollection
但有时候,如果你试图将mac放入interace中,它会说random_mac=$(hexdump -n6 -e '/1 ":%02X"' /dev/random | sed s/^://g)
。我调查了这个,它似乎与单播地址有关。我有一个解决方法:
SIOCSIFHWADDR: Cannot assign requested address
但我不太喜欢这个因为并非完全随意。它始终random_mac=00:$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 200 | md5sum | sed -r 's/^(.{10}).*$/\1/;s/([0-9a-f]{2})/\1:/g; s/:$//;')
。
任何已知的bash随机mac生成器适合单播规则?
我使用00
阅读其他方法。我尝试使用尽可能少的工具,以减少运行脚本的要求。可以在没有od
的情况下完成吗?或od
绝对总是包含在所有Linux发行版中?如果是,我可以使用它。
答案 0 :(得分:4)
根据Wikipedia,如果第一个八位字节的LSB为0,则它是单播地址。如果第一个八位字节的第二个LSB是1,则它是本地生成的MAC地址。
0x0 0000
0x1 0001
0x2 0010
0x3 0011
0x4 0100
0x5 0101
0x6 0110
0x7 0111
0x8 1000
0x9 1001
0xA 1010
0xB 1011
0xC 1100
0xD 1101
0xE 1110
0xF 1111
我们可以看到本地生成的MAC地址的安全第一个八位字节是 x 2, x 6, x A和 x E,因为它们都以10结尾。使用awk
,我们可以将它们放入一个数组中,然后用随机选择替换输出的第二个字节。
此更新版本适用于Linux或OS X:
#!/bin/bash
hexdump -n 6 -ve '1/1 "%.2x "' /dev/random | awk -v a="2,6,a,e" -v r="$RANDOM" 'BEGIN{srand(r);}NR==1{split(a,b,",");r=int(rand()*4+1);printf "%s%s:%s:%s:%s:%s:%s\n",substr($1,0,1),b[r],$2,$3,$4,$5,$6}'
或者,分散一点:
#!/bin/bash
hexdump -n 6 -ve '1/1 "%.2x "' /dev/random |\
awk -v a="2,6,a,e" -v r="$RANDOM" '
BEGIN {
srand(r);
}
NR==1 {
split(a, b, ",");
r=int(rand() * 4 + 1);
printf("%s%s:%s:%s:%s:%s:%s\n", substr($1, 0, 1), b[r], $2, $3, $4, $5, $6);
}
'
答案 1 :(得分:3)
这个怎么样?
od -An -N6 -tx1 /dev/urandom | sed -e 's/^ *//' -e 's/ */:/g' -e 's/:$//' -e 's/^\(.\)[13579bdf]/\10/'
它生成随机(单播)MAC地址
最后一个sed表达式确保将单播/多播位设置为零
贪婪的空间替换是针对UNIX seds的可移植性
od
中包含 coreutils
,因此您不必担心
更多要求