You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2.7+SQLite3获取并对比PC MAC地址功能失效求助

排查Python2.7+SQLite3 MAC地址对比失效问题

嘿,我来帮你捋一捋这个问题!你说空表存MAC没问题,但表有数据后对比MAC的功能就挂了,大概率是这几个常见坑点导致的,咱们一个个排查:

可能的问题点及修复方案

1. MAC地址格式不统一

uuid.getnode()返回的是整数类型的MAC地址,如果你存表时转成了字符串(比如标准的AA:BB:CC:DD:EE:FF格式),但对比时直接用整数和字符串比较,必然会不相等,导致功能失效。

修复方式:统一存储和对比的MAC格式,比如都转成标准字符串:

def get_standard_mac():
    mac_int = get_mac()
    # 把整数转成AA:BB:CC:DD:EE:FF格式的字符串
    return ':'.join(f"{(mac_int >> (40 - 8*i)) & 0xFF:02X}" for i in range(6))

存表和对比时都用这个函数的返回值,确保格式完全一致。

2. 数据库查询结果处理错误

当你从表中取存储的MAC时,cursor.fetchone()返回的是元组类型(比如('AA:BB:CC:DD:EE:FF',)),如果直接拿这个元组和字符串类型的当前MAC对比,肯定不匹配。

修复方式:取出元组中的第一个元素再对比:

cursor.execute("SELECT mac FROM your_table LIMIT 1")
stored_mac = cursor.fetchone()
if stored_mac:
    stored_mac = stored_mac[0]  # 提取真实的MAC字符串
else:
    # 兜底处理:理论上已经判断过表非空,但防止意外情况
    print("表中无有效MAC数据")

3. 表非空的判断逻辑错误

如果你判断表是否为空的SQL写错了,比如误判了计数结果,会导致对比逻辑根本没触发。比如写成了if count > 1而不是if count == 0。

正确的空表判断代码:

def is_table_empty(cursor):
    cursor.execute("SELECT COUNT(*) FROM your_table")
    count = cursor.fetchone()[0]
    return count == 0

4. Python2.7 uuid模块的兼容性问题

getnode()在某些系统环境下(比如虚拟机、无实体网卡设备)会返回伪造的随机MAC,导致每次获取的MAC都不一样,对比自然失败。

替代方案:换用更可靠的方式获取MAC,比如调用系统命令解析:

  • Windows系统:
import subprocess
import re

def get_real_mac():
    output = subprocess.check_output("ipconfig /all", shell=True)
    # 解析物理地址(根据系统输出编码调整decode参数)
    match = re.search(r"Physical Address[ .]+: ([0-9A-F-]+)", output.decode('gbk'))
    if match:
        return match.group(1).replace('-', ':')
    return None
  • Linux/macOS系统:
import subprocess
import re

def get_real_mac():
    output = subprocess.check_output("ifconfig", shell=True)
    match = re.search(r"ether ([0-9A-F:]+)", output.decode('utf-8'))
    if match:
        return match.group(1)
    return None

修复后的完整示例代码

import sqlite3
from uuid import getnode as get_mac

def get_standard_mac():
    mac_int = get_mac()
    return ':'.join(f"{(mac_int >> (40 - 8*i)) & 0xFF:02X}" for i in range(6))

def is_table_empty(cursor):
    cursor.execute("SELECT COUNT(*) FROM mac_storage")
    return cursor.fetchone()[0] == 0

def active():
    # 连接数据库
    conn = sqlite3.connect('device_auth.db')
    cursor = conn.cursor()
    
    # 确保表存在(如果没有的话创建)
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS mac_storage (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            mac_address TEXT UNIQUE NOT NULL
        )
    """)
    conn.commit()
    
    if is_table_empty(cursor):
        # 表为空,存入当前MAC
        current_mac = get_standard_mac()
        cursor.execute("INSERT INTO mac_storage (mac_address) VALUES (?)", (current_mac,))
        conn.commit()
        print("首次运行,MAC地址已成功存储")
    else:
        # 表非空,获取存储的MAC并对比
        cursor.execute("SELECT mac_address FROM mac_storage LIMIT 1")
        stored_mac = cursor.fetchone()[0]
        current_mac = get_standard_mac()
        
        if stored_mac != current_mac:
            print("MAC地址不匹配,程序将退出")
            conn.close()
            exit(1)
        else:
            print("MAC地址验证通过,程序继续运行")
    
    conn.close()

if __name__ == "__main__":
    active()

内容的提问来源于stack exchange,提问作者Ahmed Wagdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:52:37