DEE*_*RGE 9 python virtualization
为了创建批量虚拟机,我需要在 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))
Run Code Online (Sandbox Code Playgroud)
Rus*_*uss 10
对于任何想要生成自己的 MAC 地址的人(一个很好的例子是 VM 网卡),你可能只想要这个:
"02:00:00:%02x:%02x:%02x" % (random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255))
Run Code Online (Sandbox Code Playgroud)
或者,如果您想在 unix'y shell 中执行此操作,这适用于许多:
printf '02:00:00:%02X:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
Run Code Online (Sandbox Code Playgroud)
这为您提供了一个在您的环境中使用的 100% 安全的单播 MAC 地址,并且不会践踏任何人的注册 MAC 地址空间。
更多详情...
顶部字节 (0x02) 的底部两位为您提供本地管理的单播地址,如果您正在使用 stackoverflow 了解如何生成此地址,这可能是您想要的。:)
如果 MAC 地址不是本地管理的,则意味着它应该是“全球唯一的”。这个类别的MAC地址是在IEEE集中注册的,你应该有一个IEEE发给你的唯一的OUI(Organizationally Unique Identifier)。有关OUI 值的全局注册表,请参阅此链接。这个 OUI 值最终出现在前 3 个字节中(或者实际上只是前 22 位)。
MAC 地址并没有那么复杂,因此您可能也应该查看一下定义。维基百科有一个很好的。
从mamofish的代码修改为Python3:
mac = '00:00:00:'
for number in range(16**6):
hex_num = hex(number)[2:].zfill(6)
print("{}{}{}:{}{}:{}{}".format(mac,*hex_num))
Run Code Online (Sandbox Code Playgroud)
生成 mac 地址作为字符串,从00:00:00:00:00:00到00:00:00:ff:ff:ff。
由于唯一性是您应该关心的全部(除了使地址格式良好之外),因此我会担心 OUI 中的 MSB 并在 NIC 特定字节中使用序列。地址的分布对于您的应用程序可能并不重要(即使某些 NIC 或交换机实现可能使用它们作为哈希的输入,但这可能不是一个大问题)。
您可能需要考虑在 OUI 中使用“本地管理”标志,以避免与现有设备制造商发生冲突。
避免设置多播位等陷阱(您的示例就是这样)。