如何使用Python-Flask找到同一网络上客户端的MAC地址?

3 投票
3 回答
10310 浏览
提问于 2025-04-17 20:53

我想用Python来获取客户端的MAC地址。所有的请求都是在同一个网络上。我想找一种方法,类似于在路由器上执行 arp -n <Client_IP> 这个命令。

3 个回答

0

你可以通过 Flask 的 request.remote_addr 来获取客户端的 IP 地址,然后在你的网络接口的 ARP 表中查找它的 MAC 地址。下面的代码对我来说是有效的:

from flask import Flask, request
from python_arptable import get_arp_table

app = Flask(__name__)

def mac_from_ip(ip):
    arp_table = get_arp_table()

    for entry in arp_table:
        if entry['IP address'] == ip:
            return entry['HW address']
    return None

@app.route('/')
def get_client_mac():
    client_ip = request.remote_addr
    client_mac = mac_for_ip(client_ip)
    return client_mac
0

如果你获取了网关的信息,那么你就能找到与使用这个网关的网络接口对应的MAC地址:

>>> gateway_iface = netifaces.gateways()['default'][netifaces.AF_INET][1]
>>> netifaces.ifaddresses(gateway_iface)[netifaces.AF_LINK][0]['addr']
'de:f2:fe:66:a4:8e'
3

不太确定,但你总是可以通过请求对象来获取IP地址,比如用

request.remote_addr,为了做到这一点,你需要

import request,然后你就可以把这个IP传给这个函数

import netifaces as nif

def mac_for_ip(ip):
    'Returns a list of MACs for interfaces that have given IP, returns None if not found'
    for i in nif.interfaces():
        addrs = nif.ifaddresses(i)
        try:
            if_mac = addrs[nif.AF_LINK][0]['addr']
            if_ip = addrs[nif.AF_INET][0]['addr']
        except IndexError, KeyError: #ignore ifaces that dont have MAC or IP
            if_mac = if_ip = None
        if if_ip == ip:
            return if_mac
    return None

来自 kursancew获取MAC地址 的回答。

撰写回答