2009-11-17 37 views
14

Tôi đang tìm cách (với python) để lấy địa chỉ lớp II từ một thiết bị trên mạng cục bộ của tôi. Các địa chỉ lớp III được biết đến.Lấy địa chỉ MAC từ các thiết bị bằng cách sử dụng Python

Mục đích là xây dựng một tập lệnh sẽ thăm dò cơ sở dữ liệu địa chỉ IP theo các khoảng thời gian đều đặn đảm bảo rằng địa chỉ mac không thay đổi và nếu chúng có, email cảnh báo cho chính tôi.

+0

Anh ấy tránh ARP vô cớ, không kiểm tra nội dung trên máy cục bộ. Đọc kỹ câu hỏi: ** từ một thiết bị trên mạng cục bộ của tôi ** –

Trả lời

14

Để trả lời câu hỏi bằng Python phụ thuộc vào nền tảng của bạn. Tôi không có Windows tiện dụng, do đó, các giải pháp sau đây hoạt động trên hộp Linux tôi đã viết nó trên. Một thay đổi nhỏ đối với cụm từ thông dụng sẽ làm cho nó hoạt động trong OS X.

Trước tiên, bạn phải ping mục tiêu. Điều đó sẽ đặt mục tiêu - miễn là nó nằm trong mặt nạ mạng của bạn, nó giống như trong tình huống này, nó sẽ nằm trong bộ nhớ cache ARP của hệ thống của bạn. Quan sát:

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 

Biết rằng, bạn làm một chút subprocess kỳ diệu - nếu bạn đang viết ARP cache kiểm tra mã bản thân, và bạn không muốn làm điều đó:

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

Ha, đó chính xác là câu trả lời tôi đã viết ở giữa! –

+0

Nếu bạn không có arp (OpenWRT nào không) và có gói ip-neighbor (có thể được cài đặt trên OpenWRT) thì bạn có thể sử dụng lệnh này để lấy giá trị cho 'pid': ' pid = Popen (["ip", "neigh", "hiển thị", IP], stdout = PIPE) ' –

2

Có vẻ như bạn muốn theo dõi các trình giả mạo ARP? Trong trường hợp này, tất cả những gì bạn cần là arpwatch, có sẵn trong mọi bản phân phối Linux được cung cấp gần bạn. Tải xuống các nguồn tại đây: http://ee.lbl.gov/

3

Có một số similar question được trả lời cách đây không lâu trên trang web này. Như đã đề cập trong câu trả lời được chọn bởi người hỏi câu hỏi đó, Python không có cách tích hợp để làm điều đó. Bạn phải gọi một lệnh hệ thống như arp để nhận thông tin ARP hoặc tạo gói của riêng bạn bằng cách sử dụng Scapy.

Edit: Một ví dụ sử dụng Scapy from their website:

Dưới đây là một công cụ mà sẽ liên tục giám sát tất cả các giao diện trên một máy và in tất cả các yêu cầu ARP nó thấy, ngay cả trên 802,11 khung hình từ một Thẻ Wi-Fi ở chế độ màn hình. Lưu ý thông số store = 0 để sniff() để tránh lưu trữ tất cả các gói trong bộ nhớ cho không có gì.

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

Không chính xác những gì bạn đang tìm kiếm, nhưng chắc chắn đi đúng hướng. Thưởng thức!

0

Hãy thử sử dụng các netifaces được tìm thấy ở đây. netifaces

1

cho các hệ thống Unix dựa trên:

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

sẽ trở lại danh sách các bộ dữ liệu với máy Mac. scapy là một công cụ tuyệt vời, nhưng có vẻ là quá mức cần thiết cho trường hợp này

1

Trong Linux đôi khi bạn bỏ lỡ dòng lệnh sử dụng "arp". Ví dụ, một môi trường nhúng Linux yocto cơ bản.

Một cách khác mà không cần công cụ "arp" sẽ được đọc và phân tích các tập tin/proc/net/arp:

[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

một cách dễ dàng hơn, nếu trên linux:

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

bạn sẽ nhận được:

Address  HWtype HWaddress   Flags Mask   Iface 
    192.168..... ether 9B:39:15:f2:45:51 C      wlan0 
Các vấn đề liên quan