温馨提示×

debian readdir怎么监控

小樊
45
2026-09-04 12:01:33
栏目: 智能运维

在 Debian(或其他 Linux 系统)里,readdir 本身是一个 libc 函数,用来读取目录内容。如果你想“监控 readdir”,一般有几类常见需求,下面按场景给你讲清楚做法。


一、想监控“某个目录被读了什么”(推荐)

✅ 方法 1:inotify(最简单、最常用)

适合:监控目录被访问、读取、修改。

apt install inotify-tools

监控示例:

inotifywait -m -e access /path/to/dir

说明:

  • access:文件/目录被读取
  • open:被打开
  • modify:内容变化
  • attrib:属性变化

⚠️ 注意:

  • inotify 不能知道调用了 readdir 的进程
  • 对大量小文件性能一般

二、想监控“哪个进程调用了 readdir”

✅ 方法 2:strace(调试级监控)

适合:临时排查问题

strace -f -e trace=readdir,getdents,getdents64 -p <PID>

或启动新进程:

strace -f -e trace=readdir,getdents,getdents64 ls /

说明:

  • readdir 是 libc 封装
  • 实际系统调用是 getdents / getdents64

❌ 缺点:

  • 性能开销大
  • 不适合长期生产环境

三、想长期、系统级监控(生产环境)

✅ 方法 3:eBPF / bpftrace(现代方案)

适合:高性能、可观测性

示例(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)

优点:

  • 几乎无性能损耗
  • 可精确到进程、PID、目录

四、想“拦截 / 替换 readdir 行为”

✅ 方法 4:LD_PRELOAD

适合:测试、安全审计

写一个 .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

适合:安全软件、防病毒

fanotify_mark(fd, FAN_MARK_ADD, FAN_ACCESS, AT_FDCWD, "/path");

比 inotify 更底层,能感知“谁读了”。


总结选择建议

需求 推荐方案
看目录是否被读 inotify
看哪个进程读 strace / eBPF
长期监控 eBPF
拦截 readdir LD_PRELOAD
安全审计 fanotify

如果你能说清楚:

  • 用户态 / 内核态
  • 想监控 目录 / 进程 / 系统调用
  • 是否 生产环境

我可以直接给你一套可用的命令或代码。

0