MAC, сетевой идентификатор с использованием Python - PullRequest
0 голосов
/ 23 ноября 2010

Как получить правильный MAC / Ethernet-идентификатор локальной сетевой карты с использованием Python? Большая часть статьи о Google / stackoverflow предлагает проанализировать результаты ipconfig / all (windows) и ifconfig (Linux). В Windows (2x / XP / 7) «ipconfig / all» работает нормально, но это отказоустойчивый метод? Я новичок в Linux и не знаю, является ли ifconfig стандартным методом для получения идентификатора MAC / Ethernet.

Мне необходимо реализовать метод проверки лицензии в приложении на python, основанном на локальном идентификаторе MAC / Ethernet.

Существует особый случай, когда у вас установлены приложения VPN или виртуализации, такие как VirtualBox. В этом случае вы получите более одного идентификатора MAC / Ethernet. Это не будет проблемой, если мне придется использовать метод синтаксического анализа, но я не уверен.

Приветствия

Prashant

Ответы [ 3 ]

5 голосов
/ 23 ноября 2010
import sys
import os

def getMacAddress(): 
    if sys.platform == 'win32': 
        for line in os.popen("ipconfig /all"): 
            if line.lstrip().startswith('Physical Address'): 
                mac = line.split(':')[1].strip().replace('-',':') 
                break 
    else: 
        for line in os.popen("/sbin/ifconfig"): 
            if line.find('Ether') > -1: 
                mac = line.split()[4] 
                break 
    return mac      

- это кроссплатформенная функция, которая вернет вам ответ.

2 голосов
/ 23 ноября 2010

В Linux вы можете получить доступ к информации об оборудовании через sysfs.

>>> ifname = 'eth0'
>>> print open('/sys/class/net/%s/address' % ifname).read()
78:e7:g1:84:b5:ed

Таким образом, вы избегаете сложностей, связанных с обработкой ifconfig и анализом выходных данных.

1 голос
/ 23 ноября 2010

Я использовал решение на основе сокетов, хорошо работает на Linux, и я считаю, что Windows будет хорошо

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

getHwAddr("eth0")

Оригинальный источник

...