2009-11-17 6 views
14

का उपयोग कर उपकरणों से मैक पता प्राप्त करें मैं अपने स्थानीय नेटवर्क पर किसी डिवाइस से परत II पता प्राप्त करने के लिए एक रास्ता (पायथन के साथ) ढूंढ रहा हूं। परत III पते ज्ञात हैं।पायथन

लक्ष्य एक ऐसी स्क्रिप्ट बनाने का लक्ष्य है जो नियमित अंतराल पर आईपी पते के डेटाबेस को मतदान करेगी ताकि यह सुनिश्चित किया जा सके कि मैक पते बदल नहीं गए हैं और यदि उनके पास ईमेल अलर्ट हैं।

+0

वह नि: शुल्क एआरपी से परहेज है, स्थानीय मशीन पर सामान की जाँच नहीं। प्रश्न को ध्यान से पढ़ें: ** मेरे स्थानीय नेटवर्क पर एक डिवाइस से ** –

उत्तर

14

पायथन के साथ प्रश्न का उत्तर देने के लिए आपके प्लेटफ़ॉर्म पर निर्भर करता है। मेरे पास विंडोज़ आसान नहीं है, इसलिए निम्न समाधान लिनक्स बॉक्स पर काम करता है जिसे मैंने लिखा था। नियमित अभिव्यक्ति में एक छोटा सा परिवर्तन ओएस एक्स में काम करेगा।

सबसे पहले, आपको लक्ष्य पिंग करना होगा। यह लक्ष्य रखेगा - जब तक यह आपके नेटमास्क में है, जो इस स्थिति में ऐसा लगता है - यह आपके सिस्टम के एआरपी कैश में होगा। का निरीक्षण करें:

13:40 [email protected]% 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 [email protected]% 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 

कि जानने के बाद, आप एक छोटे से उपप्रक्रिया जादू - अन्यथा आप लिख रहे हैं एआरपी कैश कोड की जाँच अपने आप को, और आप ऐसा नहीं करना चाहती:

>>> 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" 
+2

हा, यह वही जवाब है जो मैं लिखने के बीच में था! –

+0

यदि आपके पास arp (जो OpenWRT नहीं है) है और आईपी-पड़ोसी पैकेज (जिसे ओपनडब्लूआरटी पर स्थापित किया जा सकता है) है तो आप 'pid': 'pid = popen के मान प्राप्त करने के लिए इस कमांड का उपयोग कर सकते हैं। (["आईपी", "झुंड", "शो", आईपी], stdout = पीआईपीई) ' –

2

लगता है जैसे आप एआरपी स्पूफर्स की निगरानी करना चाहते हैं? इस मामले में, आपको केवल arpwatch की आवश्यकता है, जो आपके पास हर अच्छी तरह से आपूर्ति किए गए लिनक्स वितरण में उपलब्ध है। यहां स्रोत डाउनलोड करें: http://ee.lbl.gov/

3

similar question इस साइट पर बहुत पहले नहीं उत्तर दिया गया था। जैसा कि उस प्रश्न के पूछने वाले द्वारा चुने गए उत्तर में बताया गया है, पाइथन के पास ऐसा करने का एक अंतर्निहित तरीका नहीं है। एआरपी जानकारी प्राप्त करने के लिए आपको या तो arp जैसे सिस्टम कमांड को कॉल करना होगा, या Scapy का उपयोग करके अपने स्वयं के पैकेट जेनरेट करना होगा।

संपादित करें: Scapy from their website का उपयोग कर एक उदाहरण:

यहाँ, एक और उपकरण है कि लगातार एक मशीन और प्रिंट सभी एआरपी अनुरोध यह देखता है पर सभी इंटरफ़ेस निगरानी करेंगे है यहां तक ​​कि एक से 802.11 फ्रेम पर मॉनिटर मोड में वाई-फाई कार्ड। स्टोर = 0 पैरामीटर को से के लिए मेमोरी में सभी पैकेट संग्रहीत करने के लिए स्निफ़() को स्निफ़() पर नोट करें।

#! /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) 

वास्तव में क्या आप देख रहे हैं नहीं है, लेकिन निश्चित रूप से सही रास्ते पर। का आनंद लें!

0

उपयोग करने का प्रयास यहाँ पाए गए netifaces। netifaces

1
यूनिक्स आधारित प्रणाली के लिए

:

#!/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) 

Macs के साथ tuples की सूची वापस आ जाएगी। स्कैपी एक अद्भुत उपकरण है, लेकिन इस मामले के लिए ओवरकिल है

1

लिनक्स में कुछ समय लगता है कि आप कमांड लाइन "arp" का उपयोग करते हैं। उदाहरण के लिए एक बेस yocto linux एम्बेडेड पर्यावरण छवि।

"एआरपी" उपकरण के बिना एक वैकल्पिक तरीका पढ़ सकते हैं और फ़ाइल/proc/net/एआरपी पार्स करने के लिए होगा:

[email protected]:~# 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 
0

एक आसान तरीका है, अगर लिनक्स पर:

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

आप मिल जाएगा:

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