Python - получить MAC-адрес

Я с Windows 7 и Python 2.6 . Я попробовал это:

def get_mac_address():

    c = wmi.WMI ()
    for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):
        return  interface.MACAddress

Но это не работает без интернета. Итак, я попробовал это -

from uuid import getnode 
print getnode()

И это дает мне это число, которое, как говорят, является представлением моего mac-адреса в 48 байтов Как я могу преобразовать его в стиль "ff:ff:ff:ff:ff:ff"? Или у вас есть лучший способ сделать это?

5 ответов

Решение

Это работает:

>>> address = 1234567890
>>> h = iter(hex(address)[2:].zfill(12))
>>> ":".join(i + next(h) for i in h)
'00:00:49:96:02:d2'

Или же:

>>> "".join(c + ":" if i % 2 else c for i, c in enumerate(hex(address)[2:].zfill(12)))[:-1]
'00:00:49:96:02:d2'

Или же:

>>> h = hex(address)[2:].zfill(12)
>>> ":".join(i + j for i, j in zip(h[::2], h[1::2]))
'00:00:49:96:02:d2'

Сначала вы преобразуете число в шестнадцатеричное, дополняете его до 12 символов, а затем преобразуете его в последовательность из двух строк символов, а затем соединяете их двоеточиями. Однако это зависит от точности вашего метода MAC-поиска.

Попробуйте это с Python 2:

import uuid

def get_mac():
  mac_num = hex(uuid.getnode()).replace('0x', '').upper()
  mac = '-'.join(mac_num[i : i + 2] for i in range(0, 11, 2))
  return mac

print get_mac()

Если вы используете Python 3, попробуйте это:

import uuid

def get_mac():
  mac_num = hex(uuid.getnode()).replace('0x', '').upper()
  mac = '-'.join(mac_num[i: i + 2] for i in range(0, 11, 2))
  return mac

print (get_mac())

Используя спецификации Python 3:

>>> import uuid
>>> mac_addr = hex(uuid.getnode()).replace('0x', '')
>>> print(mac_addr)
>>> 94de801e0e87
>>> ':'.join(mac_addr[i : i + 2] for i in range(0, 11, 2))
>>> '94:de:80:1e:0e:87

Или же

print(':'.join(['{:02x}'.format((uuid.getnode() >> i) & 0xff) for i in range(0,8*6,8)][::-1]))

Mac-адрес с заданным именем интерфейса:

https://gist.github.com/JayZar21/6f3fd031430d865d208c29ba55ce7ccb

# Python 2:

import socket
import fcntl
import struct

def get_hw_address(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]])[:-1]

# Python 3:

import fcntl
import socket
import struct
import binascii

def get_hw_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s',  bytes(ifname[:15], 'utf-8')))
    return ''.join(l + ':' * (n % 2 == 1) for n, l in enumerate(binascii.hexlify(info[18:24]).decode('utf-8')))[:-1]

Пример использования:

get_hw_address("eth0")

Вы не можете полагаться на uuid Модуль Если у вас есть несколько сетевых интерфейсов. Есть сторонняя библиотека, которая работает кросс-платформенной, называется getmac.

Монтаж:

pip install getmac

Использование:

from getmac import get_mac_address
eth_mac = get_mac_address(interface="eth0")
win_mac = get_mac_address(interface="Ethernet 3")
ip_mac = get_mac_address(ip="192.168.0.1")
ip6_mac = get_mac_address(ip6="::1")
host_mac = get_mac_address(hostname="localhost")
updated_mac = get_mac_address(ip="10.0.0.1", network_request=True)

Нет третьей стороны, опоздал на вечеринку! python 3, решение только для Windows:

import subprocess, re

ipconfig_all = subprocess.check_output('ipconfig /all').decode()
mac_addr_pattern = re.compile(r'(?:[0-9a-fA-F]-?){12}')
mac_addr_list = re.findall(mac_addr_pattern, ipconfig_all)

print(mac_addr_list)

код:

import re
from uuid import getnode


# to get physical address:
original_mac_address = getnode()
print("MAC Address: " + str(original_mac_address)) # this output is in raw format

#convert raw format into hex format
hex_mac_address = str(":".join(re.findall('..', '%012x' % original_mac_address)))
print("HEX MAC Address: " + hex_mac_address)

Выход:

Мой вывод

Другие вопросы по тегам