Python - Получить MAC-адрес только подключенного локального сетевого адаптера.
Цель состоит в том, чтобы собрать MAC-адрес подключенного локального сетевого адаптера, а не список всех локальных сетевых адаптеров:)
Используя socket
а также connect (to_a_website)
Я могу просто использовать getsockname()
чтобы получить IP, который используется для подключения к Интернету.
Но из IP как я могу получить MAC-адрес локальной сетевой карты?
Основная причина этого вопроса - наличие нескольких сетевых карт.
6 ответов
Как предположил Вартек netifaces
должно хорошо работать, чтобы перейти от IP->iface:
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'
Вы не можете получить MAC-адрес внешнего IP-адреса.
См. Обсуждение того, как получить mac-адрес внешнего IP в C# для получения дополнительной информации.
Вы не можете поймать MAC-адрес из сокета. Вам нужен кадр Ethernet, который находится на самом нижнем уровне цепочки обработки tcp. Для этого вам нужно отслеживать (перехватывать) сетевой трафик, находить некоторые пакеты, анализируя пакеты. заголовок. и извлеките из него требуемую информацию, такую как MAC-адрес.
это полезный код, который может помочь вам сделать это.
Еще один обходной способ получения системного идентификатора Mac - использовать команду ping для проверки связи с именем системы, а затем выполнить запрос arp -a для проверяемого IP-адреса. В таком случае вам нужно записать ответ ping в память python и выполнить операцию readline, чтобы получить IP-адрес, а затем записать соответствующие данные ARP в память при записи системного имени, IP-адреса и Mac ID для рассматриваемой машины, либо для дисплея, либо для тестового файла.
Я пытаюсь сделать что-то похожее в качестве проверки системы проверки, чтобы улучшить автоматизацию процедуры тестирования, и сценарий в настоящее время находится на python.
Примитивный способ сделать это - использовать инструменты командной строки, доступные в вашей ОС. Запустите инструмент, используя subprocess
модуль (не os.system()
!), собрать вывод и разобрать его.
В Windows нужная вам команда ipconfig /all
,
На большинстве Unices, включая Linux, OSX и BSD, это ifconfig
,
Возможно, есть лучший способ сделать это без использования утилиты командной строки, но я этого не знаю... пока.
Пример вывода ipconfig /all
в Windows XP:
D:\Documents and Settings\LAYip>ipconfig /all
Windows IP Configuration
Host Name . . . . . . . . . . . . : <redacted>
Primary Dns Suffix . . . . . . . : <redacted>
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : <redacted>
<redacted>
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . : <redacted>
Description . . . . . . . . . . . : Intel(R) 82579LM Gigabit Network Con
nection #2
Physical Address. . . . . . . . . : 5C-26-0A-60-8D-C7
Dhcp Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
IP Address. . . . . . . . . . . . : xxx.xxx.28.29
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : xxx.xxx.28.254
DHCP Server . . . . . . . . . . . : xxx.xxx.23.13
DNS Servers . . . . . . . . . . . : xxx.xxx.23.13
xxx.xxx.23.11
Lease Obtained. . . . . . . . . . : Thursday, 12 April 2012 9:14:41 AM
Lease Expires . . . . . . . . . . : Friday, 20 April 2012 9:14:41 AM
Ethernet adapter VirtualBox Host-Only Network:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : VirtualBox Host-Only Ethernet Adapter
Physical Address. . . . . . . . . : 08-00-27-00-28-E6
Dhcp Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 192.168.56.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
Выход из ifconfig
под Linux:
lws@helios:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:25:22:db:8c:b6
inet addr:10.1.1.2 Bcast:10.1.1.255 Mask:255.255.255.0
inet6 addr: fe80::225:22ff:fedb:8cb6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:322333 errors:0 dropped:0 overruns:0 frame:0
TX packets:296952 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40005876 (40.0 MB) TX bytes:162343969 (162.3 MB)
Interrupt:40 Base address:0x4000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:362 errors:0 dropped:0 overruns:0 frame:0
TX packets:362 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:31806 (31.8 KB) TX bytes:31806 (31.8 KB)