Python 中的 MAC 地址生成器

问题描述 投票:0回答:6

为了创建批量虚拟机,我需要在 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))
python virtualization
6个回答
15
投票

对于任何想要生成自己的 MAC 地址的人(VM NIC 就是一个很好的例子),您可能只需要这个:

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

或者,如果你想在 unix'y shell 中执行此操作,这适用于许多:

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

这为您提供了一个单播 MAC 地址,可以在您的环境中 100% 安全地使用,并且不会破坏任何人注册的 MAC 地址空间。


更详细...

顶部字节 (0x02) 的底部两位为您提供本地管理的单播地址,如果您访问 stackoverflow 了解如何生成该地址,这可能就是您想要的。 :)

如果 MAC 地址不是本地管理,则意味着它应该是“全球唯一”。此类别中的 MAC 地址在 IEEE 集中注册,您应该拥有 IEEE 向您颁发的唯一 OUI(组织唯一标识符)。请参阅 this 链接了解 OUI 值的全局注册表。该 OUI 值最终位于前 3 个字节(或者实际上只是前 22 位)。

MAC 地址并没有那么复杂,因此您可能还应该看一下定义。维基百科有一个很好的


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 地址字符串。


1
投票

由于唯一性是您应该关心的全部(除了使地址格式良好之外),我会担心 OUI 中的 MSB 并在 NIC 特定字节中使用序列。地址的分布对于您的应用程序可能并不重要(即使某些 NIC 或交换机实现可能使用它们作为哈希的输入,但这可能不是一个大问题)。

可能想考虑在 OUI 中使用“本地管理”标志以避免与现有设备制造商发生冲突。

避免设置多播位等陷阱(您的示例就是如此)。


0
投票

为了避免重复:

如果你要生成很多(数百万)这样的 MAC 地址,你可能想要生成一个按顺序的 MAC 地址列表,将其提供给线性随机化过程(GNU sort -R 应该很好 - 我不这样做)不要认为它会在线性时间内完成此操作,但它具有类似的最终结果)一次,然后根据需要将新地址从随机列表的一端拉出。我相信这样的列表应该大约有 34 MB。

如果您只需要数千个,您可能最好维护一个包含已选择值的文本文件,并检查是否存在冲突,并随时添加新值。渐近地讲,这是一个较慢的算法,但它的开销要少得多,因此对于较少数量的 mac 地址来说,它仍然应该是一个胜利。

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


0
投票

对于那些来这里只是为了简单的一句台词而不在乎重复的人:

import random
print(":".join([('0'+hex(random.randint(0,256))[2:])[-2:].upper() for _ in range(6)]))

## '8A:16:71:27:0D:1D'

0
投票

使用Python,最简单的方法是使用generate_mac 包。一旦你用 pip (或者你使用的任何东西)安装了它:

from generate_mac import generate_mac
random_mac_address = generate_mac.total_random()

这会生成一个随机 MAC 地址,例如:AC:A6:10:2C:F9:7E

© www.soinside.com 2019 - 2024. All rights reserved.