mkdir -p -m 700 后父目录权限仍是 755
mkdir 的 -m 只影响明确指定的新目录,自动补建父目录按 umask 处理。区分已有路径,使用受限掩码建立新目录树,并定向调整已审查目录。
执行 mkdir -p -m 700 a/b/c 后,c 是 700,新建的 a、b 却可能是 755 或 775。命令没有失败,权限也不一定被另一个程序改过:-m 只为命令行明确指定的新目录设置模式,不会把同一模式套到 -p 自动补出的所有父目录。
下面针对 Linux 上 GNU mkdir 与普通 Unix 权限位。示例假定目录位于自己控制的位置,没有默认 ACL 或特殊组继承要求;存在这些机制时,需要同时核对它们,不能只根据 umask 推断完整访问权限。
分清末级目录、补建父目录和已有目录
对于 mkdir -p -m 700 a/b/c,明确指定的目录是 a/b/c。如果 a、a/b 缺失,-p 会创建它们,权限基于当前 umask,并保证属主有继续创建下级所需的写入、搜索权限。
例如普通场景下,umask 为 022 时,补建父目录通常得到 755;umask 为 002 时通常得到 775。-m 700 仍然只作用于新建的 c。这个行为让 mkdir 能继续进入父目录并创建下一层,而不是在半途把自己挡住。
先查看当前掩码和每一层的状态:
umask
ls -ld -- ./a ./a/b ./a/b/c
路径是示例,应改成自己的目标。ls -ld 显示目录本身,不是列出其内容。已有的父目录不会因为再次执行 mkdir -p 就被修改;连末级目录原本就存在时,mkdir -p -m 700 也不能代替一次权限调整。
因此,脚本返回成功只说明创建或确认目录存在这一步完成了,不能证明整个目录树都获得了 700。
新建私有目录树时,先限制创建掩码
如果目标是建立一棵只有当前用户访问的新目录树,可以在子 shell 中设置 umask 077。下面要求在自己拥有、无其他用户可写的工作目录中操作,./private-tree 尚不存在:
(
umask 077
mkdir -- ./private-tree &&
mkdir -p -- ./private-tree/a/b
)
第一条 mkdir 没有 -p。如果同名文件、目录或符号链接已经存在,它会失败,后面的创建不会继续,避免把一棵已有目录树误认为刚创建的私有目录。示例不是面向可被其他用户改动的共享路径的并发安全创建算法。
在前述普通权限条件下,private-tree、a、b 应为 700。括号把 umask 的影响限制在这组命令中,不会改变调用方后续创建其他文件时的默认掩码。
核对每层目录及命令退出状态:
stat -c '%a %n' -- ./private-tree ./private-tree/a ./private-tree/a/b
这使用 GNU stat 的格式选项。若创建失败,不要继续向不完整目录树写入数据;若权限与预期不同,先检查 ACL、父目录继承与实际工具环境。不要在只看过末级目录后就宣称整棵树已隔离。
已有目录需要单独、定向处理
已有路径不能靠重跑 mkdir 修正。先确认路径不是符号链接、归属符合预期,记录现有权限以及 ACL,并判断哪些服务依赖这些目录。收紧目录搜索权限可能立刻让运行中的其他用户无法访问里面的文件。
只有确认这些目录属于本次任务、允许改为属主独占,且不存在需要保留的 ACL 或特殊模式位策略后,才可以对明确列出的目录调整普通模式,例如:
chmod 700 -- ./reviewed-tree ./reviewed-tree/a ./reviewed-tree/a/b
./reviewed-tree 表示已经审查过的目标,不能直接替换成家目录、共享数据根目录或整套应用目录。不要为了省事使用 chmod -R:它还会修改目录里的普通文件和不属于这次修复的对象。
umask 也不会追溯修改已有目录。将其改得更严格以后,仍应复查先前已经创建的各层路径。
恢复按原权限记录进行
新建目录的创建结果不符合要求时,先停止向其中写入业务数据;仅在确认是本次新建且仍为空的目录上逐层清理,不递归删除未知内容。已有目录的权限调整需要按变更前记录恢复,不能统一猜成 755。
如果目录已经因过宽权限暴露过内容,收紧权限只改变之后的访问条件,不会撤回已经被读取的数据。涉及敏感文件时,应按实际暴露范围另行处理,不能把 mkdir 的退出成功当作安全验收。


