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
相关产品推荐
相关产品推荐

