Получите MAC-адрес из Устройств с помощью Python

Я ищу путь (с Python) для получения layer II адрес от устройства в моей локальной сети. Layer III адреса известны.

Цель состоит в том, чтобы создать сценарий, который опросит базы данных IP-адресов на равных интервалах, гарантирующих, что MAC-адреса не изменились и если они имеют, предупреждения по электронной почте мне.

19
задан ZF007 5 July 2019 в 09:15
поделиться

3 ответа

Ответ на вопрос с помощью Python зависит от вашей платформы. У меня нет Windows под рукой, поэтому следующее решение работает с Linux, на котором я его написал. Небольшое изменение регулярного выражения заставит его работать в OS X.

Во-первых, вы должны пропинговать цель. Это поместит цель - до тех пор, пока она находится в пределах вашей сетевой маски, как это звучит в данной ситуации - в кеш ARP вашей системы. Заметьте:

13:40 jsmith@undertow% ping 97.107.138.15
PING 97.107.138.15 (97.107.138.15) 56(84) bytes of data.
64 bytes from 97.107.138.15: icmp_seq=1 ttl=64 time=1.25 ms
^C

13:40 jsmith@undertow% arp -n 97.107.138.15
Address                  HWtype  HWaddress           Flags Mask            Iface
97.107.138.15            ether   fe:fd:61:6b:8a:0f   C                     eth0

Зная это, вы совершаете небольшую магию подпроцесса - в противном случае вы сами пишете код проверки кэша ARP, и вы не хотите этого делать:

>>> from subprocess import Popen, PIPE
>>> import re
>>> IP = "1.2.3.4"

>>> # do_ping(IP)
>>> # The time between ping and arp check must be small, as ARP may not cache long

>>> pid = Popen(["arp", "-n", IP], stdout=PIPE)
>>> s = pid.communicate()[0]
>>> mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0]
>>> mac
"fe:fd:61:6b:8a:0f"
19
ответ дан 30 November 2019 в 03:59
поделиться

Похоже, вы хотите отслеживать спуферы ARP? В этом случае все, что вам нужно, это arpwatch , доступный в каждом хорошо поставляемом дистрибутиве Linux рядом с вами. Загрузите источники здесь: http://ee.lbl.gov/

2
ответ дан 30 November 2019 в 03:59
поделиться

Не так давно на этом сайте был дан аналогичный вопрос . Как упоминалось в ответе, выбранном тем, кто задает этот вопрос, Python не имеет встроенного способа сделать это. Вы должны либо вызвать системную команду, например arp , чтобы получить информацию ARP, либо сгенерировать свои собственные пакеты, используя Scapy .

Изменить: Пример с использованием Scapy со своего веб-сайта :

Вот еще один инструмент, который постоянно контролировать все интерфейсы на машина и распечатайте все запросы ARP видит, даже на кадрах 802.11 из Карта Wi-Fi в режиме монитора. Обратите внимание store = 0 параметр для sniff (), чтобы избежать сохранение всех пакетов в памяти для ничего.

#! /usr/bin/env python
from scapy import *

def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")

sniff(prn=arp_monitor_callback, filter="arp", store=0)

Не совсем то, что вы ищете, но определенно на правильном пути. Наслаждайтесь!

5
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: