Python中的MAC地址生成器

12 投票
6 回答
23891 浏览
提问于 2025-04-17 08:16

为了批量创建虚拟机,我需要在Python中写一个随机MAC地址生成器。我不知道怎么生成随机的MAC地址。

下面这个程序是对的吗?

import random

# The first line is defined for specified vendor
mac = [ 0x00, 0x24, 0x81,
    random.randint(0x00, 0x7f),
    random.randint(0x00, 0xff),
    random.randint(0x00, 0xff) ]

print ':'.join(map(lambda x: "%02x" % x, mac))

6 个回答

1

在处理地址时,最重要的就是确保它们是唯一的(当然,地址的格式也要正确)。我建议关注地址中的高位字节(MSBs),然后在网络接口卡(NIC)特定的字节中使用一个序列。地址的分布对你的应用来说可能并不重要(虽然有些网络接口卡或交换机的实现可能会把它们作为哈希的输入,但这通常不是个大问题)。

你可以考虑在地址中使用“本地管理”这个标志,以避免和现有设备制造商的地址发生冲突。

要避免一些常见的错误,比如设置多播位(你的例子中就有这个问题)。

5

这是从mamofish的代码修改过来的,适用于Python3:

mac = '00:00:00:'
for number in range(16**6):
    hex_num = hex(number)[2:].zfill(6)
    print("{}{}{}:{}{}:{}{}".format(mac,*hex_num))

这个代码会生成从00:00:00:00:00:0000:00:00:ff:ff:ff的MAC地址,结果以字符串的形式呈现。

15

如果你想自己生成MAC地址(比如为虚拟机的网络接口卡),你可能只需要这个:

"02:00:00:%02x:%02x:%02x" % (random.randint(0, 255),
                             random.randint(0, 255),
                             random.randint(0, 255))

或者,如果你想在类Unix的命令行中做这个,下面的代码在很多系统上都能用:

printf '02:00:00:%02X:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))

这样生成的MAC地址是单播地址,使用起来非常安全,不会和其他人注册的MAC地址冲突。


更详细的说明...

在第一个字节的最后两位(0x02)可以让你得到一个本地管理的单播地址,这正是你在StackOverflow上查找如何生成MAC地址时想要的。:)

如果MAC地址不是本地管理的,那就意味着它应该是“全球唯一”的。这类MAC地址是由IEEE集中注册的,你应该有一个由IEEE发给你的唯一OUI(组织唯一标识符)。想了解更多,可以查看这个链接,里面有全球OUI值的注册信息。这个OUI值会出现在前3个字节中(实际上就是前22位)。

MAC地址其实并不复杂,所以你也可以看看它的定义。维基百科上有一个不错的解释

撰写回答