문제

나는 (파이썬과 함께) layer II 내 로컬 네트워크의 장치에서 주소. Layer III 주소가 알려져 있습니다.

목표는 정기적 인 간격으로 IP 주소 데이터베이스를 설문 조사하여 MAC 주소가 변경되지 않았으며 이메일 알림을 직접 알리는 스크립트를 작성하는 것입니다.

도움이 되었습니까?

해결책

파이썬으로 질문에 답하기 위해 플랫폼에 따라 다릅니다. 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"

다른 팁

거기가 있었다 비슷한 질문 이 사이트에서 얼마 전까지까지 답변했습니다. 해당 질문의 요청자가 선택한 답변에서 언급했듯이, Python에는 내장 방법이 없습니다. 다음과 같은 시스템 명령을 호출해야합니다 arp ARP 정보를 얻거나 사용하여 자신의 패킷을 생성하려면 Scapy.

편집하다: SCAPY를 사용하는 예 그들의 웹 사이트에서:

다음은 기계의 모든 인터페이스를 지속적으로 모니터링하고 모니터 모드의 Wi-Fi 카드의 802.11 프레임에서도 볼 수있는 모든 ARP 요청을 인쇄하는 또 다른 도구입니다. 스토어 = 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)

정확히 당신이 찾고있는 것이 아니라 확실히 올바른 길에 있습니다. 즐기다!

ARP 스푸퍼를 모니터링하고 싶은 것 같습니까? 이 경우 필요한 모든 것이 있습니다 Arpwatch, 근처에 잘 알려진 Linux 배포판에서 사용할 수 있습니다. 여기에 출처를 다운로드하십시오. http://ee.lbl.gov/

UNIX 기반 시스템의 경우 :

#!/usr/bin/env python2.7

import re
import subprocess
arp_out =subprocess.check_output(['arp','-lan'])

re.findall(r"((\w{2,2}\:{0,1}){6})",arp_out)

Mac이있는 튜플 목록을 반환합니다. SCAPY는 놀라운 도구이지만이 경우에는 과잉 인 것 같습니다.

Linux에서 언젠가 당신은 "arp"명령 줄을 놓치고 있습니다. 예를 들어 기본 Yocto Linux 내장 환경 이미지.

"ARP"도구가없는 다른 방법은 파일/Proc/Net/ARP를 읽고 구문 분석하는 것입니다.

root@raspberrypi:~# cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
192.168.1.1      0x1         0x2         xx:xx:xx:xx:xx:xx     *        wlan0
192.168.1.33     0x1         0x2         yy:yy:yy:yy:yy:yy     *        wlan0

Linux에서 더 쉬운 방법 :

print os.system('arp -n ' + str(remoteIP))

당신은 얻을 것입니다 :

    Address        HWtype  HWaddress           Flags Mask            Iface
    192.168.....   ether   9B:39:15:f2:45:51   C                     wlan0

192.168.0.0/24 서브넷을 스캔하는 SCAPY를 사용한 간단한 솔루션은 다음과 같습니다.

from scapy.all import *

ans,unans = arping("192.168.0.0/24", verbose=0)
for s,r in ans:
    print("{} {}".format(r[Ether].src,s[ARP].pdst))

여기에있는 netifaces를 사용해보십시오. 네티페이스

Python 3.7에 대한 일반 업데이트. 비고 : 옵션 -n ~을 위한 arp Linux 기반 시스템에 대한 특정 답변이 제공되는 Windows 시스템에서 ARP 목록을 제공하지 않습니다. 옵션을 사용하십시오 -a 여기에서 답에 명시된 바와 같이.

from subprocess import Popen, PIPE

pid = Popen(['arp', '-a', ip], stdout=PIPE, stderr=PIPE)

IP, MAC, var = ((pid.communicate()[0].decode('utf-8').split('Type\r\n'))[1]).split('     ')
IP  =  IP.strip(' ')
MAC =  MAC.strip(' ')

if ip == IP:
    print ('Remote Host : %s\n        MAC : %s' % (IP, MAC))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top