2010-01-06 32 views

Trả lời

4

Bạn có thể thử lệnh arp -a

Dưới đây là vài liên kết về Mac Địa chỉ grabbing (không kiểm tra)

Trong Linux/Unix, arping chạy,

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

Trong Windows, sử dụng API trình trợ giúp IP thông qua ctypes

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

+2

Hoặc, 'arp -n $ IP', để chỉ lọc địa chỉ IP mong muốn. –

+0

Cảm ơn, Trong Windows, 'arp -a $ IP' chỉ là một lưu ý. – YOU

+1

Xin lưu ý rằng điều này sẽ không gửi thông báo WHO_HAS trên mạng - địa chỉ của bạn đã được máy của bạn nhìn thấy, có thể không có nếu bạn có mạng lớn (các mục cũ cũng có thể bị xóa nếu bộ nhớ cache quá lớn). –

0

Nhiều năm trước, tôi được giao nhiệm vụ thu thập thông tin máy khác nhau từ tất cả các máy trong khuôn viên của công ty. Một mẩu thông tin mong muốn là địa chỉ MAC, rất khó để có được một mạng mở rộng nhiều mạng con. Vào thời điểm đó, tôi đã sử dụng lệnh "nbtstat" được tích hợp sẵn của Windows.

Hôm nay có một tiện ích Unix được gọi là "nbtscan" cung cấp thông tin tương tự. Nếu bạn không muốn sử dụng một công cụ bên ngoài, có thể có các thư viện NetBIOS cho python có thể được sử dụng để thu thập thông tin cho bạn?

0

bạn có thể sử dụng ở hai win32 hoặc linux

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]) 

NB: mục arp sẽ tắt sau một thời gian, bạn cần phải "làm ngập mạng của bạn" ví dụ ping, do đó arp -a hiển thị remotehost của bạn.

+0

Vì vậy, theo một nghĩa nào đó. Ví dụ này chưa hoàn chỉnh. – Nightforce2

2

mục nhập arp có thể không bao giờ đúng, tôi đã cố ping một máy chủ nhiều lần nhưng arp -a sẽ không cho tôi địa chỉ mac/ethernet của nó. (Không lo lắng về mã cửa sổ từ trạng thái hoạt động BTW)

Cách đáng tin cậy trên Linux (và * nix) là sử dụng chế độ arping hoặc scappy (xem http://en.wikipedia.org/wiki/Arping) và sau đó phân tích đầu ra. Đây là mã tôi đã sử dụng. Bạn phải root hoặc sử dụng sudo để chạy 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

Sử dụng các lệnh này:

arp -n <IP Address>|awk '/<ip address>/ {print $3}' 

ví dụ, nếu bạn muốn địa chỉ mac của 192.168.10.1:

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

Nếu bạn chỉ muốn truy vấn bộ nhớ cache arp của hệ điều hành, hạt nhân Linux hợp lý gần đây hỗ trợ điều này:

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

Xin chào, đây là cách khắc phục nhanh chóng để 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])) 
Các vấn đề liên quan