温馨提示×

centos readdir如何监控

小樊
46
2026-09-12 01:35:15
栏目: 智能运维

在 CentOS 上,“监控 readdir”通常有两种理解:

  1. 监控某个目录被 readdir(被列举)了(谁、什么时候读了目录)
  2. 在程序中用 readdir() 读取目录并做监控/审计

下面分别说明常见做法。


一、监控“谁在读某个目录”(系统级监控)

1. 使用 auditd(推荐,CentOS 自带)

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() 调用,但足以发现“目录被读”。


2. 使用 inotify(适合程序级监听)

inotify 可以监听目录变化,但 不能直接监听 readdir

可监听的事件:

  • IN_OPEN
  • IN_ACCESS
  • IN_CLOSE_NOWRITE

示例(安装 inotify-tools):

yum install -y inotify-tools
inotifywait -m -e access,open /data

access 可能对应目录被读取,但不一定是 readdir。


3. 使用 SystemTap / eBPF(高级)

如果你必须 精确监控 readdir() 系统调用

SystemTap 示例(需 debuginfo)

probe syscall.readdir {
    printf("pid=%d cmd=%s dir=%s\n", pid(), execname(), user_string($path))
}

eBPF(现代方式,CentOS 8+)

  • bpftrace
  • bcc 工具集
bpftrace -e 'tracepoint:syscalls:sys_enter_getdents* { printf("%s %d\n", comm, pid); }'

二、在 C 程序中“用 readdir 做监控”

如果你是写程序:

#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);
}

配合 inotifyauditd 做外部监控更可靠。


三、总结建议

需求 推荐方案
看谁读了目录 auditd
看目录是否被访问 inotify
精确 readdir 调用 SystemTap / eBPF
程序内部监控 readdir + 日志

如果你能说明:

  • CentOS 版本
  • 是系统审计还是程序开发
  • 是否需要实时告警

我可以给你更具体的方案。

0