2010-01-06 12 views
5

का उपयोग कर रिमोट मैक पता प्राप्त करें मैं अपने लैन पर रिमोट होस्ट का मैक पता कैसे प्राप्त करूं? मैं पायथन और लिनक्स का उपयोग कर रहा हूँ।पायथन और लिनक्स

उत्तर

4

आप चल आदेश arp -a

यहाँ है मैक पता हथियाने (परीक्षण नहीं)

लिनक्स/यूनिक्स में, के बारे में कुछ लिंक arping कोशिश कर सकते हैं,

http://www.ibm.com/developerworks/aix/library/au-pythocli/

Windows में, का उपयोग करते हुए आईपी ​​हेल्पर एपीआई ctypes

http://code.activestate.com/recipes/347812/

+2

या, 'arp -n $ IP', केवल वांछित आईपी पते पर फ़िल्टर करने के लिए। –

+0

धन्यवाद, विंडोज़ में, 'arp -a $ IP' बस एक नोट। – YOU

+1

ध्यान रखें कि यह नेटवर्क पर WHO_HAS संदेश नहीं भेजेगा - पता पहले से ही आपकी मशीन द्वारा देखा गया है, जो हो सकता है कि आपके पास कोई बड़ा नेटवर्क न हो (यदि कैश भी पुरानी प्रविष्टियां हटा दी जा सकती है बहुत बड़ा हो जाता है)। –

0

कई साल पहले, मुझे कॉर्पोरेट परिसर में सभी मशीनों से विभिन्न मशीन जानकारी एकत्र करने के साथ काम सौंपा गया था। जानकारी का एक वांछित टुकड़ा मैक पता था, जो कई सबनेट्स पर फैले नेटवर्क पर जाना मुश्किल है। उस समय, मैंने विंडोज़ अंतर्निहित "nbtstat" कमांड का उपयोग किया था।

आज एक यूनिक्स उपयोगिता है जिसे "nbtscan" कहा जाता है जो समान जानकारी प्रदान करता है। यदि आप बाहरी उपकरण का उपयोग नहीं करना चाहते हैं, तो शायद पाइथन के लिए नेटबीओएसओ पुस्तकालय हैं जिनका उपयोग आपके लिए जानकारी एकत्र करने के लिए किया जा सकता है?

0

आप या तो Win32 या लिनक्स पर इसका उपयोग कर सकते

import subprocess 
import sys 
remotehost="192.168.0.122" 
cmd="arp -a" 
p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
output, errors = p.communicate() 
if output is not None : 
    if sys.platform in ['linux','linux2']: 
     for i in output.split("\n"): 
      if remotehost in i: 
       for j in i.split(): 
        if ":" in j: 
         print "%s--> %s" % (remotehost,j) 
    elif sys.platform in ['win32']: 
     item = output.split("\n")[-2] 
     if remotehost in item: 
      print "%s--> %s" %(remotehost, item.split()[1]) 

एनबी: एआरपी प्रविष्टियों कुछ समय के बाद बंद हो जाता है, तो आप, उदाहरण के लिए पिंग "अपने नेटवर्क बाढ़" की जरूरत है ताकि एआरपी -एक अपने remotehost को दर्शाता है।

+0

तो एक अर्थ में। यह उदाहरण अपूर्ण है। – Nightforce2

2

एआरपी प्रविष्टियां कभी सही नहीं हो सकतीं, मैंने कई बार मेजबान पिंग करने की कोशिश की लेकिन arp -a मुझे यह मैक/ईथरनेट पता नहीं देगा। (सक्रिय स्थिति बीटीडब्लू से विंडोज कोड के साथ कोई चिंता नहीं)

लिनक्स (और * निक्स) पर विश्वसनीय तरीका arping या scappy का उपयोग करना है (http://en.wikipedia.org/wiki/Arping देखें) और फिर आउटपुट को पार्स करें। यहां इस्तेमाल किया गया कोड है। आपको रूट होना चाहिए या arping चलाने के लिए सूडो का उपयोग करना होगा।

cmd = '/sbin/arping -c 1 ' + remotehost  

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)        
output, errors = p.communicate()                
if output is not None :                  
    mac_addr = re.findall(r'(\[.*\])', output)[0].replace('[', '').replace(']', '')  
3

इन आदेशों का उपयोग करें:

arp -n <IP Address>|awk '/<ip address>/ {print $3}' 
उदाहरण के लिए

, आप 192.168.10.1 के मैक पते चाहते हैं:

#arp -n 192.168.10.1|awk '/192.168.10.1/ {print $3}' 
#00:0c:29:68:8f:a4 
1

तुम सिर्फ ओएस 'एआरपी कैश क्वेरी करना चाहते हैं, उचित रूप से हाल ही में लिनक्स कर्नेल इसका समर्थन करते हैं:

import os, sys 

host = sys.argv[1] 

# ping is optional (sends a WHO_HAS request) 
os.popen('ping -c 1 %s' % host) 

# grep with a space at the end of IP address to make sure you get a single line 
fields = os.popen('grep "%s " /proc/net/arp' % host).read().split() 
if len(fields) == 6 and fields[3] != "00:00:00:00:00:00": 
    print fields[3] 
else: 
    print 'no response from', host 
0

नमस्ते यह एक त्वरित फिक्स है python3

import subprocess 
import sys 
remotehost="192.168.0.122" 
cmd="arp -a" 
p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
output, errors = p.communicate() 

if output is not None : 
    output = output.decode('ascii') 
    if sys.platform in ['linux','linux2']: 
     for i in output.split("\n"): 
      if remotehost in i: 
       for j in i.split(): 
        if ":" in j: 
         print("%s--> %s" % (remotehost,j)) 
    elif sys.platform in ['win32']: 
     item = output.split("\n")[-2] 
     if remotehost in item: 
      print("%s--> %s" %(remotehost, item.split()[1])) 
संबंधित मुद्दे