Bash。生成随机 mac 地址(单播)

Bash. Generate random mac address (unicast)

我需要在 bash 中生成随机 mac 地址而不使用 macchanger 或类似工具。

我有这个:

random_mac=$(hexdump -n6 -e '/1 ":%02X"' /dev/random | sed s/^://g)

但有时,如果您尝试将 mac 放入界面,它会显示 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}).*$//;s/([0-9a-f]{2})/:/g; s/:$//;')

但我不太喜欢这个,因为它不是完全随机的。它始终以 00 开头。

任何已知的 bash 随机 mac 生成器符合单播规则?

我使用 od 阅读了其他方法。我正在尝试使用尽可能少的工具,以便减少对 运行 脚本的要求。不用od可以吗?还是 od 绝对总是包含在所有 Linux 发行版中?是的话我就可以用了

根据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 地址的安全第一个八位字节是 x2, x6, xA,和xE,因为它们都以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(,0,1),b[r],,,,,}'

或者,展开一点:

#!/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(, 0, 1), b[r], , , , , );
    }
'

这个怎么样?

od -An -N6 -tx1 /dev/urandom | sed -e 's/^  *//' -e 's/  */:/g' -e 's/:$//' -e 's/^\(.\)[13579bdf]//'

它生成一个随机(单播)MAC地址

  • 最后一个 sed 表达式确保 unicast/multicast 位设置为零

  • 贪婪的 space 替换是为了跨 UNIX seds 的可移植性

od包含在coreutils中所以你不用担心 更多要求