programing

MAC 주소 가져오기

javajsp 2023. 4. 14. 21:12

MAC 주소 가져오기

실행 시 컴퓨터의 MAC 주소를 결정하는 크로스 플랫폼 방법이 필요합니다.윈도의 경우 'wmi' 모듈을 사용할 수 있으며 Linux에서 찾을 수 있는 유일한 방법은 ifconfig를 실행하고 출력 전체에서 regex를 실행하는 것이었습니다.하나의 OS에서만 동작하는 패키지를 사용하는 것을 좋아하지 않으며, 다른 프로그램의 출력을 해석하는 것은 오류가 발생하기 쉬운 것은 말할 것도 없고 우아하지 않은 것 같습니다.

MAC 주소를 취득하는 크로스 플랫폼 방식(Windows와 Linux)을 알고 있는 사람이 있습니까?만약 그렇지 않다면, 위에 열거한 방법보다 더 우아한 방법을 아는 사람이 있나요?

Python 2.5에는 MAC 주소가 필요한 UUID 구현이 포함되어 있습니다.Mac 검색 기능을 사용자 고유의 코드로 쉽게 가져올 수 있습니다.

from uuid import getnode as get_mac
mac = get_mac()

반환값은 48비트 정수로서의 MAC 주소입니다.

Linux에서 특정 로컬인터페이스의 MAC를 취득하기 위한 이 문제에 대한 순수한 python 솔루션은 원래 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')

다음은 Python 3 호환 코드입니다.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import fcntl
import socket
import struct


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


def main():
    print(getHwAddr('enp0s8'))


if __name__ == "__main__":
    main()

netifaces는 MAC 주소(및 기타 주소)를 취득하기 위한 적절한 모듈입니다.크로스 플랫폼이기 때문에 소켓이나 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'}]

여러 개의 인터넷인터페이스를 사용할 수 있습니다.

특정 인터페이스의 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")

은 '는 것입니다.uuid.getnode()는 예상과 다를 수 있는 임의의 48비트 번호를 반환함으로써 MAC 주소를 위조할 수 있습니다.을 명시적으로 것은 만, 「 」, 「MAC」, 「MAC」, 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 주소의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「MAC」의 「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.

답변은 이쪽 https://stackoverflow.com/a/18031868/2362361 에서 이용하실 수 있습니다.

MAC는 여러 개(블루투스, 여러 개의 NIC 등)가 존재할 수 있으므로 어느 iface에 사용할 것인지 아는 것이 중요합니다.

은, 의 의 를 있는 에, 「」 의 iface 의 IP 를 사용해 합니다.netifaces(PyPI에서 사용 가능):

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]

종속성을 가져도 괜찮다면 크로스 플랫폼 getmac 패키지가 이를 위해 작동합니다.Python 2.7+ 및 3.4+에서 작동합니다.주소를 얻거나 None을 반환할 때까지 다양한 방법을 시도합니다.

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)

면책사항:제가 패키지 제작자입니다.

업데이트(2019년 1월 14일) : 패키지는 현재 Python 2.7+와 3.4+만 지원합니다.오래된 Python(2.5, 2.6, 3.2, 3.3)으로 작업해야 하는 경우에도 이전 버전의 패키지를 사용할 수 있습니다.

조건 Import를 사용하여 파이썬에서 자체 크로스 플랫폼 라이브러리를 구축할 수 있습니다.

import platform
if platform.system() == 'Linux':
  import LinuxMac
  mac_address = LinuxMac.get_mac_address()
elif platform.system() == 'Windows':
  # etc

이것에 의해, os.system 콜 또는 플랫폼 고유의 라이브러리를 사용할 수 있습니다.

입수 방법eth0인터페이스 MAC 주소,

import psutil

nics = psutil.net_if_addrs()['eth0']

for interface in nics:
   if interface.family == 17:
      print(interface.address)

nice는 실제로 사전 내에서 사전을 반환하고 목록을 반환하며 목록 내에서 스테이플을 반환합니다. 그러나 NIC['Ethernet'][0] 주소 반복은 문제를 해결합니다.

import psutil

nics = psutil.net_if_addrs()

mac_address = nics['Ethernet'][0].address

print(mac_address)

크로스 플랫폼코드는, Windows 에서는 100% 동작하지 않습니다.이것은 Windows 로 동작합니다.

import psutil
print([(k, addr.address) for k, v in psutil.net_if_addrs().items() for addr in v if addr.family == -1])

예:

[
    ('Local Area Connection', '01-23-45-67-89-0A'), 
    ('Wireless Network Connection', '23-45-67-89-0A-BC'), 
    ('Bluetooth Network Connection', '45-67-89-0A-BC-DE'), 
    ('isatap.{01ABCDEF-0123-4567-890A-0123456789AB}', '00-00-00-00-00-00-00-01')
]

통일된 방법에 대해서는 잘 모르지만, 다음과 같은 것이 도움이 될 수 있습니다.

http://www.codeguru.com/Cpp/I-N/network/networkinformation/article.php/c5451

이 경우 이 명령어를 함수로 정리하고 OS에 따라 적절한 명령어를 실행하여 필요에 따라 해석하고 원하는 형식의 MAC 주소만 반환합니다.물론 모두 마찬가지지만, 단 한 번만 하면 되고, 메인 코드에서 보면 더 깨끗해 보입니다.

또,

import uuid
mac_id=(':'.join(['{:02x}'.format((uuid.getnode() >> ele) & 0xff)

Linux의 경우 MAC 주소를 표시하고 변경할 수 있는 셸 스크립트를 소개합니다(MAC 스니핑).

 ifconfig eth0 | grep HWaddr |cut -dH -f2|cut -d\  -f2
 00:26:6c:df:c3:95

(나는 전문가가 아니다) 논쟁은 생략할 수 있습니다.

ifconfig etho | grep HWaddr
eth0      Link encap:Ethernet  HWaddr 00:26:6c:df:c3:95  

MAC 를 변경하려면 , 다음의 조작을 실시합니다.

ifconfig eth0 down
ifconfig eth0 hw ether 00:80:48:BA:d1:30
ifconfig eth0 up

는 MAC 주소를 00:80:48로 변경합니다.BA:d1:30 (일시적으로 재부팅 시 실제 상태로 복원됩니다)

Linux의 경우 SIOCGIFHWADDR ioctl을 사용하여 MAC 주소를 검색할 수 있습니다.

struct ifreq    ifr;
uint8_t         macaddr[6];

if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0)
    return -1;

strcpy(ifr.ifr_name, "eth0");

if (ioctl(s, SIOCGIFHWADDR, (void *)&ifr) == 0) {
    if (ifr.ifr_hwaddr.sa_family == ARPHRD_ETHER) {
        memcpy(macaddr, ifr.ifr_hwaddr.sa_data, 6);
        return 0;
... etc ...

질문에 "피톤"이라는 태그를 붙였습니다.저는 이 정보를 얻을 수 있는 기존 Python 모듈을 모릅니다.ctypes를 사용하여 ioctl을 직접 호출할 수 있습니다.

언급URL : https://stackoverflow.com/questions/159137/getting-mac-address