温馨提示×

linux readdir能否隐藏

小樊
45
2026-10-08 13:15:41
栏目: 智能运维

在 Linux 下,readdir() 本身不能“隐藏”文件,它只是按内核/文件系统返回目录项。是否“看到”某个文件,取决于:

  1. 文件系统层面是否把该文件列出来
  2. 调用者权限
  3. 挂载选项 / 内核特性
  4. 用户态过滤(程序自己不显示)

下面分情况说明。


一、readdir 为什么不能“直接隐藏”

readdir()(以及 getdents())读取的是目录项(directory entries),由内核从文件系统返回。

struct dirent *readdir(DIR *dirp);

它没有参数可以指定“忽略某些文件”,也不能让内核“不返回某文件”。

✅ 能做的:

  • 程序里 if (strcmp(de->d_name, "xxx")) continue;
    ❌ 不能做的:
  • 让别的程序也看不到这个文件

二、真正“隐藏”文件的几种方式

1️⃣ 用户态过滤(最常见,但不是真隐藏)

while ((de = readdir(dir))) {
    if (de->d_name[0] == '.') continue;
}

✅ ls 默认就是这样
❌ readdir 仍然能读到


2️⃣ 改名成点文件(.secret)

  • 只是约定俗成
  • 文件系统层面仍存在
  • ls -a / readdir 都能看到

3️⃣ 权限控制(不是隐藏,是看不到)

chmod 700 dir
  • 无权限用户 opendir() 直接失败
  • readdir() 不会被调用

✅ 算“逻辑隐藏”
❌ 不是文件级隐藏


4️⃣ 挂载覆盖(mount --bind)

mount --bind /empty /some/dir
  • 原目录内容被“盖住”
  • readdir 看到的是挂载层内容

✅ 真隐藏原内容
⚠ 需要 root


5️⃣ 内核模块 / eBPF 拦截(高级)

  • 拦截 getdents64
  • 在返回用户态前“删掉”某些项

✅ 真正隐藏
❌ 需要 root / 内核级能力


6️⃣ 特殊文件系统(overlay / tmpfs)

  • overlayfs 可“上层覆盖下层”
  • 某些文件在底层不可见

三、常见误解澄清

说法 是否正确
readdir 可以隐藏文件 ❌
点文件是隐藏文件 ❌(只是约定)
chmod 700 是隐藏 ❌(是禁止访问)
mount 可以隐藏 ✅
内核模块可以隐藏 ✅

四、总结一句话

readdir() 无法隐藏文件,它只是“如实读取”。
真正隐藏只能靠:权限、挂载、内核拦截或用户态过滤。

如果你有具体场景(比如:

  • 想让别人 ls 看不到
  • 想防 readdir
  • 想写一个“隐藏目录”的程序)
    可以告诉我,我可以给更针对性的方案。

0 踩