2009-11-17 101 views
14

我正在尋找一種方法(使用python)從本地網絡上的設備獲取第二層地址。第三層地址是已知的。從使用Python的設備獲取MAC地址

目標是構建一個腳本,該腳本將定期輪詢IP地址數據庫,以確保MAC地址未發生更改,並且如果他們有,則會向我發送電子郵件警報。

+0

他避免免費ARP,在本地機器上沒有檢查的東西。仔細閱讀問題:**從本地網絡上的設備** – 2009-11-17 18:31:55

回答

14

用Python來回答這個問題取決於你的平臺。我沒有Windows,所以下面的解決方案在我寫的Linux機器上工作。對正則表達式的小改動會使其在OS X中工作。

首先,您必須ping目標。這將放置目標 - 只要它位於你的網絡掩碼中,在你的系統的ARP緩存中,這聽起來像是在這種情況下。注意:

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 

知道了,你做一個小魔子 - 否則你寫的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" 
+2

哈,這正是我在寫作過程中的答案! – 2009-11-17 18:46:04

+0

如果你沒有arp(哪個OpenWRT沒有)並且有ip-neighbour軟件包(可以安裝在OpenWRT上),那麼你可以使用這個命令來獲得'pid'的值: 'pid = Popen ([「ip」,「neigh」,「show」,IP],stdout = PIPE) – 2015-12-30 07:07:01

2

聽起來像你想監測ARP欺騙者?在這種情況下,您所需要的全部是arpwatch,可以在您附近的每個良好供應的Linux版本中使用。在這裏下載源代碼:http://ee.lbl.gov/

3

有一個similar question不久前在這個網站上回答。正如提問者所選擇的答案中所提到的那樣,Python沒有內置的方法來實現它。您必須調用系統命令(例如arp)以獲取ARP信息,或使用Scapy生成您自己的數據包。

編輯:使用Scapy的from their website一個例子:

這裏是另一個工具,將 不斷監視 機和打印所有ARP請求它 看到在所有接口上,即使是在從802.11幀 Wi-Fi卡處於監視模式。注意 store = 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) 

不是你要找什麼,但肯定在正確的軌道。請享用!

1

基於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是一個了不起的工具,但似乎是這種情況下的矯枉過正

1

在Linux有時你會錯過命令行util「arp」。例如,基於yocto linux嵌入式環境的圖像。

沒有 「ARP」 工具的另一種方法是讀取和解析文件/ proc /網/ 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

一個更簡單的方法,如果在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