我需要一种在运行时确定计算机MAC地址的跨平台方法.对于Windows,可以使用'wmi'模块,我可以找到Linux下唯一的方法是运行ifconfig并在其输出中运行正则表达式.我不喜欢使用只能在一个操作系统上运行的软件包,而解析另一个程序的输出似乎并不优雅,更不用说容易出错了.
有谁知道跨平台方法(windows和linux)方法来获取MAC地址?如果没有,有没有人知道比我上面列出的更优雅的方法?
Python 2.5包含一个uuid实现(至少在一个版本中)需要mac地址.您可以轻松地将mac查找功能导入到您自己的代码中:
from uuid import getnode as get_mac mac = get_mac()
返回值是mac地址为48位整数.
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')
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简介
另外一件事你应该注意的是,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.
有时我们有多个网络接口.
查找特定接口的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")
使用我的答案: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'
您可以使用跨平台的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]