我正在尋找一種方法(使用python)從本地網絡上的設備獲取第二層地址。第三層地址是已知的。從使用Python的設備獲取MAC地址
目標是構建一個腳本,該腳本將定期輪詢IP地址數據庫,以確保MAC地址未發生更改,並且如果他們有,則會向我發送電子郵件警報。
我正在尋找一種方法(使用python)從本地網絡上的設備獲取第二層地址。第三層地址是已知的。從使用Python的設備獲取MAC地址
目標是構建一個腳本,該腳本將定期輪詢IP地址數據庫,以確保MAC地址未發生更改,並且如果他們有,則會向我發送電子郵件警報。
用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"
哈,這正是我在寫作過程中的答案! – 2009-11-17 18:46:04
如果你沒有arp(哪個OpenWRT沒有)並且有ip-neighbour軟件包(可以安裝在OpenWRT上),那麼你可以使用這個命令來獲得'pid'的值: 'pid = Popen ([「ip」,「neigh」,「show」,IP],stdout = PIPE) – 2015-12-30 07:07:01
聽起來像你想監測ARP欺騙者?在這種情況下,您所需要的全部是arpwatch,可以在您附近的每個良好供應的Linux版本中使用。在這裏下載源代碼:http://ee.lbl.gov/
有一個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)
不是你要找什麼,但肯定在正確的軌道。請享用!
嘗試使用在這裏找到的netifaces。 netifaces
基於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是一個了不起的工具,但似乎是這種情況下的矯枉過正
在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
一個更簡單的方法,如果在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
他避免免費ARP,在本地機器上沒有檢查的東西。仔細閱讀問題:**從本地網絡上的設備** – 2009-11-17 18:31:55