在 Linux 下,readdir() 本身不能“隐藏”文件,它只是按内核/文件系统返回目录项。是否“看到”某个文件,取决于:
下面分情况说明。
readdir()(以及 getdents())读取的是目录项(directory entries),由内核从文件系统返回。
struct dirent *readdir(DIR *dirp);
它没有参数可以指定“忽略某些文件”,也不能让内核“不返回某文件”。
✅ 能做的:
if (strcmp(de->d_name, "xxx")) continue;while ((de = readdir(dir))) {
if (de->d_name[0] == '.') continue;
}
✅ ls 默认就是这样
❌ readdir 仍然能读到
.secret)ls -a / readdir 都能看到chmod 700 dir
opendir() 直接失败readdir() 不会被调用✅ 算“逻辑隐藏”
❌ 不是文件级隐藏
mount --bind /empty /some/dir
readdir 看到的是挂载层内容✅ 真隐藏原内容
⚠ 需要 root
getdents64✅ 真正隐藏
❌ 需要 root / 内核级能力
| 说法 | 是否正确 |
|---|---|
| readdir 可以隐藏文件 | ❌ |
| 点文件是隐藏文件 | ❌(只是约定) |
| chmod 700 是隐藏 | ❌(是禁止访问) |
| mount 可以隐藏 | ✅ |
| 内核模块可以隐藏 | ✅ |
readdir()无法隐藏文件,它只是“如实读取”。
真正隐藏只能靠:权限、挂载、内核拦截或用户态过滤。
如果你有具体场景(比如:
ls 看不到readdir