2011-12-13 1370 views
2

为了创建批量虚拟机,我需要在Python中创建一个随机MAC地址生成器。我不知道如何生成随机MAC地址。python中的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)) 
+1

您是否试图特别生成[MAC地址](http://en.wikipedia.org/wiki/MAC_address)? – sarnold

+0

是制造特定的 –

+0

该示例程序适用于单个MAC地址,但它存在真正的风险,您将为多台机器生成相同的伪MAC地址,这可能会导致奇怪的网络问题。 – sarnold

回答

1

由于独特性是你应该关心的(除了使合式的地址),我会担心的MSB的OUI,并在特定的网卡使用的字节序列。地址分配对您的应用程序可能并不重要(即使某些NIC或交换机实现可能将它们用作散列输入,这可能不是一个大问题)。

可能想要考虑使用“本地管理的”flag in the OUI以避免与现有设备制造商发生冲突。

避免陷入像设置多播位(你的例子)。

0

为了避免重复:

如果你要产生这样的MAC地址的大量(上百万),你可能想生成MAC的的有序列表,喂的是一个线性随机过程( GNU排序-R应该做的很好 - 我不认为它在线性时间这样做,但它有类似的最终结果)一次,然后根据需要将新的地址从随机列表的一端拖出。我相信这样的清单应该适合大约34兆字节。

如果您只需要数千个,您最好使用已经选定的值来维护文本文件,然后检查是否存在冲突,并随时添加新值。这是一种比较慢的算法,但它的开销要小得多,所以对于较少数量的mac地址,它应该仍然是一个赢。

顺便说一句,如果第4个八位字节(从1开始编号从左开始)是0-ff而不是0-7f?我看到在维基百科页面没有出现的1408米或127 MAC地址: http://en.wikipedia.org/wiki/MAC_address

0

mamofish's code修改到Python3:

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:0000:00:00:ff:ff:ff字符串。

0

任何人想要生成自己的MAC地址(一个很好的例子是VM网卡),你可能只是想这样的:

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

或者,如果你想这样做的unix'y壳,此作品多次在:

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

这给你一个单播MAC地址,它是100%安全的环境中使用,而不是践踏任何人的注册MAC地址空间。


更多细节...

最高字节(0×02),给你一个本地管理的单播地址,这可能是你想要什么,如果你打的如何生成计算器的底部两位这个。:)

如果MAC地址是而不是本地管理,这意味着它应该是“全球唯一”。此类MAC地址在IEEE中集中注册,并且您应该拥有由IEEE颁发给您的唯一OUI(组织唯一标识符)。请参阅this链接获取OUI值的全局注册表。这个OUI值结束于前3个字节(或者仅仅是前22个位)。

MAC地址并不复杂,所以你应该也许只是看看定义。维基百科有a good one