Python中的MAC地址生成器
为了批量创建虚拟机,我需要在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:00
到00: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地址其实并不复杂,所以你也可以看看它的定义。维基百科上有一个不错的解释。