在 Debian(或其他 Linux 系统)里,readdir 本身是一个 libc 函数,用来读取目录内容。如果你想“监控 readdir”,一般有几类常见需求,下面按场景给你讲清楚做法。
适合:监控目录被访问、读取、修改。
apt install inotify-tools
监控示例:
inotifywait -m -e access /path/to/dir
说明:
access:文件/目录被读取open:被打开modify:内容变化attrib:属性变化⚠️ 注意:
适合:临时排查问题
strace -f -e trace=readdir,getdents,getdents64 -p <PID>
或启动新进程:
strace -f -e trace=readdir,getdents,getdents64 ls /
说明:
readdir 是 libc 封装getdents / getdents64❌ 缺点:
适合:高性能、可观测性
示例(bpftrace):
bpftrace -e '
tracepoint:syscalls:sys_enter_getdents64 {
printf("%s (%d) reading dir fd=%d\n", comm, pid, args->fd);
}'
需要:
apt install bpftrace linux-headers-$(uname -r)
优点:
适合:测试、安全审计
写一个 .so 覆盖 readdir:
#define _GNU_SOURCE
#include <dirent.h>
#include <stdio.h>
struct dirent *readdir(DIR *dirp) {
fprintf(stderr, "readdir called\n");
return __readdir(dirp);
}
编译:
gcc -shared -fPIC -o readdir_hook.so hook.c -ldl
使用:
LD_PRELOAD=./readdir_hook.so ls /
⚠️ 仅对用户态程序有效,不适用于静态二进制。
适合:安全软件、防病毒
fanotify_mark(fd, FAN_MARK_ADD, FAN_ACCESS, AT_FDCWD, "/path");
比 inotify 更底层,能感知“谁读了”。
| 需求 | 推荐方案 |
|---|---|
| 看目录是否被读 | inotify |
| 看哪个进程读 | strace / eBPF |
| 长期监控 | eBPF |
| 拦截 readdir | LD_PRELOAD |
| 安全审计 | fanotify |
如果你能说清楚:
我可以直接给你一套可用的命令或代码。