为了创建批量虚拟机,我需要在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))
答案 0 :(得分:1)
由于唯一性是您应该关心的(除了使地址格式正确)之外,我会担心OUI中的MSB并使用NIC特定字节中的序列。地址的分配对您的应用程序来说可能并不重要(即使某些NIC或交换机实现可能将它们用作哈希的输入,这可能不是一个大问题。)
希望考虑使用“本地管理”flag in the OUI来避免与现有设备制造商发生冲突。
避免像设置多播位这样的陷阱(你的例子)。
答案 1 :(得分:1)
mac = '00:00:00:'
for number in range(16**6):
hex_num = hex(number)[2:].zfill(6)
print("{}{}{}:{}{}:{}{}".format(mac,*hex_num))
将mac地址生成为00:00:00:00:00:00
到00:00:00:ff:ff:ff
的字符串。
答案 2 :(得分:1)
对于想要生成自己的MAC地址的人(一个很好的例子是VM NIC),你可能只想要这个:
"02:00:00:%02x:%02x:%02x" % (random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255))
或者,如果你想在unix的shell中这样做,这适用于很多:
printf '02:00:00:%02X:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
这为您提供了一个在您的环境中100%安全使用的单播MAC地址,并且不会践踏任何人注册的MAC地址空间。
更多细节......
顶部字节(0x02)的最后两位为您提供本地管理的单播地址,如果您正在使用stackoverflow来获取如何生成此地址,那么这可能是您想要的。 :)
如果MAC地址不在本地管理,则意味着它应该是全球唯一的#34;。此类别中的MAC地址已在IEEE中集中注册,您应该拥有IEEE颁发给您的唯一OUI(组织唯一标识符)。有关OUI值的全局注册表,请参阅this链接。这个OUI值最后是前3个字节(或者恰好是前22个字节)。
MAC地址并不复杂,所以您应该只看一下定义。维基百科有a good one。
答案 3 :(得分:0)
为避免重复:
如果你要生成很多(数百万)这样的MAC地址,你可能想要生成MAC的有序列表,将其提供给线性随机化过程(GNU排序-R应该没问题 - 我不要认为它在线性时间内这样做,但它有一个类似的最终结果),然后根据需要从随机列表的一端拉出新的地址。我相信这样的列表应该适合大约34兆字节。
如果您只需要数千个,那么最好还是维护一个包含已选择值的文本文件,并检查与之冲突,并随时添加新值。这是一个较慢的算法,但是它的开销要小得多,因此对于较少数量的mac地址来说仍然是一个胜利。
顺便说一句,如果第4个八位字节(从左边开始编号为1),是0-ff而不是0-7f?我发现在Mac地址的维基百科页面中没有出现7f或127: http://en.wikipedia.org/wiki/MAC_address