2016-07-04 3 views
2

У меня есть устройство в локальной сети и известно его MAC-адрес. Он автоматически получает IP-адрес через DHCP. Я хочу получить этот IP-адрес.Получить IP-адрес от MAC с помощью python

Я не хочу использовать nmap, но scapy будет хорошо, поскольку я импортирую из приложения kivy.

я нашел:

from scapy.all import srp, Ether, ARP 
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2) 

и с

ans.summary() 

я получаю следующий результат:

Ether/ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether/ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1 

Мои две проблемы:

1: Я должен запустить скрипт с sudo pyth и я не уверен насчет разрешений в киви.

2: Есть ли простой способ получить переменные для IP/MAC из .summary()?

ответ

3

Да, вы можете сделать это с помощью scapy. Вот пример ARP будет-в пакете:

###[ Ethernet ]### 
    dst= 08:00:27:fa:25:8e 
    src= 08:00:27:b1:af:68 
    type= 0x806 
    ###[ ARP ]### 
    hwtype= 0x1 
    ptype= 0x800 
    hwlen= 6 
    plen= 4 
    op= is-at 
    hwsrc= 08:00:27:b1:af:68 
    psrc= 192.168.56.102 
    hwdst= 08:00:27:fa:25:8e 
    pdst= 192.168.56.101 
     ###[ Padding ]### 
      load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00' 

Вы можете назначить значения hwsrc и КРОУ переменной как этот

srcMAC = pkt[ARP].hwsrc 
srcIP = pkt[ARP].psrc 

или просто напечатать их, как это

print pkt[ARP].hwsrc 
print pkt[ARP].psrc 

Надеюсь, что помогает.

+0

Спасибо! Это сработало для меня. Nice :) –

+0

Извините, я не могу ответить на ваш ответ. Я получил небольшую репутацию: D –

0

Если сумма сводки всегда одна и та же (что я предполагаю), то вы могли бы import re и использовать регулярное выражение для извлечения IP-адреса.

Должно быть что-то вроде:

re.sub(r'.* says (.*) ==> Ether/ARP is.*', r'\1', ans.summary()) 

Это работает для меня:

>>> import re 
>>> x = "Ether/ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether/ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1" 
>>> re.sub(r'.* says (.*) ==> Ether/ARP is.*', r'\1', x) 
'192.168.43.92' 
+0

Thank u! Я попробовал это, но ans.summary() не возвращает строку или буфер: –

+0

Traceback (последний последний звонок): Файл «», строка 1, в re.sub (r '. * Says (. *)) ==> Ether/ARP is. * ', R' \ 1 ', ans.summary()) Файл "/usr/lib/python2.7/re.py", строка 155, в под return _compile (шаблон, флаги) .sub (repl, string, count) ТипError: ожидаемая строка или буфер –

+0

Какой тип данных является ans.summary()? – fuuman

Смежные вопросы