可通过三条终端指令组合实现:用fs_usage捕获进程级读写调用,fswatch监听目录变更事件,stat循环观测文件大小与时间戳变化;三者分别定位“谁在写”“写了什么路径”“写了多少”,互补还原完整读写行为。

macOS 本身不提供图形化“开启监控”的开关,但可通过终端组合指令,对特定敏感目录实现实时、低延迟、可落地的读写行为监控。关键不是轮询扫描,而是接入系统原生事件机制(FSEvents)和内核级 I/O 调用链。
用 fs_usage 实时捕获底层读写调用
这是最贴近内核的方式,能显示哪个进程在何时对目录内文件执行了 open、read、write、unlink 等操作,并附带路径、数据量和时间戳:
- 监控整个目录(含子目录)所有写入行为:
sudo fs_usage -w | grep -E "(write|truncate|open.*W).*\/path\/to\/sensitive" - 排除自身日志干扰,减少噪音:
sudo fs_usage -e fs_usage -w | grep "/SensitiveData" - 只盯住某个可疑进程(如 backupd 或 Dropbox):
sudo fs_usage backupd 或 sudo fs_usage -p $(pgrep -f "Dropbox")
用 fswatch 监听目录级变更事件
fswatch 是基于 FSEvents 的轻量封装,响应快、不漏事件,适合感知“文件增删改”这类高层动作,且无需 root 权限:
- 安装后监听敏感目录(如
/Users/you/Confidential):
brew install fswatch && fswatch -o ~/Confidential - 每有变动就输出一行完整路径,可直接接管道做后续处理:
fswatch -o ~/Confidential | xargs -n1 echo "Changed:" - 防重复触发(例如保存时多次写入):
fswatch -l 0.3 ~/Confidential(0.3 秒内合并同类事件)
用 stat 循环追踪关键文件状态变化
当需要确认是否发生“静默写入”(如日志膨胀、缓存增长、APFS 克隆体被修改),可用此法秒级观测体积与时间戳变动:
- 持续打印目标目录下某关键文件大小和最后修改时间:
while true; do stat -f "%z bytes — %Sm" -t "%H:%M:%S" ~/Confidential/config.plist; sleep 1; done - 判断是否触发写时复制(克隆失效):
stat -f "%i %z" original.txt copy.txt(inode 不同 + 大小增大 = 已脱离克隆) - 同步观察该目录所在卷的磁盘空间变化:
watch -n1 "df -h | grep '\/Users$'"
补充:启用 OpenBSM 审计获取持久化记录
若需长期留痕、满足合规审计要求,可启用系统自带的 openbsm 审计子系统,它会将每次 fr(读)、fw(写)等访问记录为二进制日志:
- 扩展审计标志并重启服务:
sudo sed -i '' 's/^flags:.*/flags:lo,aa,fr,fw,fa,fc,fd/' /etc/security/audit_control && sudo audit -n && sudo killall -HUP auditd - 日志默认存于
/var/audit/,用 praudit 解析并过滤敏感路径:
sudo praudit /var/audit/* 2>/dev/null | awk '/path:/ {p=$0; next} /fr|fw/ && p {print p; p=""}' | grep "Confidential"
三者定位不同:fs_usage 告诉你“谁在写”,fswatch 告诉你“写了什么路径”,stat 告诉你“写了多少”。配合使用,就能完整还原一次异常读写行为的全貌。


















