当前位置:  开发笔记 > 编程语言 > 正文

获取MAC地址

如何解决《获取MAC地址》经验,为你挑选了7个好方法。

我需要一种在运行时确定计算机MAC地址的跨平台方法.对于Windows,可以使用'wmi'模块,我可以找到Linux下唯一的方法是运行ifconfig并在其输出中运行正则表达式.我不喜欢使用只能在一个操作系统上运行的软件包,而解析另一个程序的输出似乎并不优雅,更不用说容易出错了.

有谁知道跨平台方法(windows和linux)方法来获取MAC地址?如果没有,有没有人知道比我上面列出的更优雅的方法?



1> Armin Ronach..:

Python 2.5包含一个uuid实现(至少在一个版本中)需要mac地址.您可以轻松地将mac查找功能导入到您自己的代码中:

from uuid import getnode as get_mac
mac = get_mac()

返回值是mac地址为48位整数.


或者`':'.join((%012X"%mac)[i:i + 2] for i in range(0,12,2))`用于大写MAC,每个字节用冒号分隔.
`hex(mac)`获取熟悉的十六进制格式的mac
我只是在Windows机箱上尝试过这个功能很棒...除了我试过它的笔记本电脑有2个NIC(一个无线),并且无法确定它返回的MAC.如果您想使用此代码,请注意警告.
只是一个警告:如果你查看`getnode`文档,它会说如果它无法检测到mac它会返回一个随机的长:"如果所有获取硬件地址的尝试都失败了,我们选择一个随机的48位数字根据RFC 4122的建议将其第8位设置为1." 所以检查第八位!
每次重新启动Windows 7笔记本电脑时,getnode()都会返回不同的内容.
@deinonychusaur我有一个有效的mac地址,其中[第一个八位字节的最低有效位为1](https://www.ietf.org/rfc/rfc4122.txt).所以看来这还不足以验证返回值.但是,mhawke在下面的答案中提供了可能有效的解决方案.

2> synthesizerp..:

Linux下的这个问题的纯python解决方案,用于获取特定本地接口的MAC,最初由vishnubob发布为评论,并在此活动状态配方中由Ben Mackey改进

#!/usr/bin/python

import fcntl, socket, struct

def getHwAddr(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
    return ':'.join(['%02x' % ord(char) for char in info[18:24]])

print getHwAddr('eth0')



3> camflan..:

netifaces是一个很好的模块,用于获取mac地址(和其他地址).它是跨平台的,比使用socket或uuid更有意义.

>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0', 'tun2']

>>> netifaces.ifaddresses('eth0')[netifaces.AF_LINK]
[{'addr': '08:00:27:50:f2:51', 'broadcast': 'ff:ff:ff:ff:ff:ff'}]

pypi的位置

很好的netifaces简介



4> mhawke..:

另外一件事你应该注意的是,uuid.getnode()可以通过返回一个随机的48位数来伪造MAC地址,这可能不是你所期望的.此外,没有明确指示MAC地址已伪造,但您可以通过调用getnode()两次并查看结果是否变化来检测它.如果两个呼叫都返回相同的值,则您拥有MAC地址,否则您将获得伪造的地址.

>>> print uuid.getnode.__doc__
Get the hardware address as a 48-bit positive integer.

    The first time this runs, it may launch a separate program, which could
    be quite slow.  If all attempts to obtain the hardware address fail, we
    choose a random 48-bit number with its eighth bit set to 1 as recommended
    in RFC 4122.


检查刚刚完成:if(mac >> 40)%2:引发OSError,"系统似乎没有有效的MAC"
并不是说第8个的值是1,因为它不能被网卡使用.只需检查此位就足以检测地址是否伪造.

5> Julio Schurt..:

有时我们有多个网络接口.

查找特定接口的mac地址的简单方法是:

def getmac(interface):

  try:
    mac = open('/sys/class/net/'+interface+'/address').readline()
  except:
    mac = "00:00:00:00:00:00"

  return mac[0:17]

调用方法很简单

myMAC = getmac("wlan0")



6> 小智..:

使用我的答案:https://stackoverflow.com/a/18031868/2362361

重要的是要知道你想要MAC的iface,因为许多可以存在(蓝牙,几个nics等).

当您使用netifaces(在PyPI中提供)知道您需要MAC的iface的IP时,这可以完成这项工作:

import netifaces as nif
def mac_for_ip(ip):
    'Returns a list of MACs for interfaces that have given IP, returns None if not found'
    for i in nif.interfaces():
        addrs = nif.ifaddresses(i)
        try:
            if_mac = addrs[nif.AF_LINK][0]['addr']
            if_ip = addrs[nif.AF_INET][0]['addr']
        except IndexError, KeyError: #ignore ifaces that dont have MAC or IP
            if_mac = if_ip = None
        if if_ip == ip:
            return if_mac
    return None

测试:

>>> mac_for_ip('169.254.90.191')
'2c:41:38:0a:94:8b'



7> Python Novic..:

您可以使用跨平台的psutil进行此操作:

import psutil
nics = psutil.net_if_addrs()
print [j.address for j in nics[i] for i in nics if i!="lo" and j.family==17]

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有