在 CentOS 上,“监控 readdir”通常有两种理解:
下面分别说明常见做法。
auditd 可以监控目录的访问,包括 readdir(实际是 opendir/readdir 对应的 syscall)。
# 监控 /data 目录的读操作
auditctl -w /data -p r -k dir_read
说明:
-w:监控路径-p r:读权限(包括目录列举)-k:关键字,便于搜索ausearch -k dir_read
或实时查看:
tail -f /var/log/audit/audit.log
⚠️ 注意:audit 监控的是 路径级访问,不是精确捕获
readdir()调用,但足以发现“目录被读”。
inotify 可以监听目录变化,但 不能直接监听 readdir。
可监听的事件:
IN_OPENIN_ACCESSIN_CLOSE_NOWRITE示例(安装 inotify-tools):
yum install -y inotify-tools
inotifywait -m -e access,open /data
access可能对应目录被读取,但不一定是 readdir。
如果你必须 精确监控 readdir() 系统调用:
probe syscall.readdir {
printf("pid=%d cmd=%s dir=%s\n", pid(), execname(), user_string($path))
}
bpftracebcc 工具集bpftrace -e 'tracepoint:syscalls:sys_enter_getdents* { printf("%s %d\n", comm, pid); }'
如果你是写程序:
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/data");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("file: %s\n", entry->d_name);
}
closedir(dir);
}
配合 inotify 或 auditd 做外部监控更可靠。
| 需求 | 推荐方案 |
|---|---|
| 看谁读了目录 | auditd |
| 看目录是否被访问 | inotify |
| 精确 readdir 调用 | SystemTap / eBPF |
| 程序内部监控 | readdir + 日志 |
如果你能说明:
我可以给你更具体的方案。