温馨提示×

Debian readdir如何修改

小樊
46
2026-08-12 07:26:05
栏目: 智能运维

Debian(以及所有 Linux) 里,readdir 不是让你直接“修改”的函数,而是读取目录内容的接口
如果你说的“修改 readdir”,通常有几种不同含义,我分别说明,并给出正确做法。


一、readdir 是什么(先澄清概念)

readdirPOSIX / glibc 提供的函数,用于读取目录:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

只能读,不能改目录内容
❌ 不存在 readdir 修改文件名、删除文件这种用法


二、如果你是想「修改 readdir 的行为」

✅ 情况 1:想过滤 readdir 返回的结果(最常见)

正确方式:在用户态过滤

DIR *dir = opendir(".");
struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {
    if (entry->d_name[0] == '.')  // 隐藏文件
        continue;

    printf("%s\n", entry->d_name);
}
closedir(dir);

✅ 这是推荐做法


✅ 情况 2:想“拦截 / 修改” readdir 系统调用(高级)

例如:

  • 隐藏某些文件
  • 做沙箱 / 容器 / 安全审计

方法 1:使用 LD_PRELOAD(用户态 hook)

#define _GNU_SOURCE
#include <dirent.h>
#include <string.h>
#include <dlfcn.h>

struct dirent *readdir(DIR *dirp) {
    static struct dirent *(*real_readdir)(DIR *) =
        dlsym(RTLD_NEXT, "readdir");

    struct dirent *entry;
    while ((entry = real_readdir(dirp)) != NULL) {
        if (strstr(entry->d_name, "secret") == NULL)
            return entry;
    }
    return NULL;
}

编译:

gcc -fPIC -shared fake_readdir.c -o fake_readdir.so -ldl

使用:

LD_PRELOAD=./fake_readdir.so ls

✅ 常用于调试、安全、透明代理


✅ 情况 3:修改内核中的 readdir(不推荐)

readdir 最终调用的是:

  • getdents / getdents64 系统调用
  • VFS → 具体文件系统(ext4 / xfs / overlayfs)

如果你真的要改内核:

  1. 获取 Debian 内核源码

    apt source linux
    
  2. 修改路径(示例):

    fs/readdir.c
    fs/ext4/dir.c
    
  3. 重新编译内核

  4. 安装并重启

⚠️ 风险极高

  • 系统可能启动失败
  • 与 Debian 官方内核不兼容

✅ 一般只在:

  • 内核开发
  • 内核安全研究
  • 文件系统开发

三、如果你其实是想「修改目录内容」

readdir 本身做不到,要用这些函数:

需求 函数
重命名 rename()
删除文件 unlink() / rmdir()
创建文件 creat() / open()
创建目录 mkdir()

示例:

rename("old.txt", "new.txt");
unlink("a.txt");

四、总结一句话

readdir 不能修改,只能读;想“修改 readdir”只能通过过滤、hook 或改内核实现。


如果你能补充一句:

  • 你是 C 程序开发 / 内核开发 / 想隐藏文件 / 想调试 ls
  • Debian 10 / 11 / 12
  • ext4 / overlayfs / docker 环境

我可以给你精确到代码级别的方案。

0