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
'programing' 카테고리의 다른 글
| Powershell의 'more' 명령어 또는 'less' 명령어 중 어느 것에 해당합니까? (0) | 2023.04.14 |
|---|---|
| Swift 3, 4, 5에서 GCD 뒤에 dispatch_를 쓰는 방법은 무엇입니까? (0) | 2023.04.14 |
| IValueConverter 인터페이스에서 ConvertBack 메서드는 어떤 용도로 사용됩니까? (0) | 2023.04.14 |
| composer.lock을 버전 제어에 커밋하시겠습니까? (0) | 2023.04.14 |
| 사용 중인 Swift 버전을 확인하려면 어떻게 해야 합니까? (0) | 2023.04.14 |