linux中mkdir命令的-m选项(非-m)可一步创建目录并精确设置八进制权限,仅作用于末级目录,需含执行位x且绕过umask;上级目录仍按默认权限创建。

Linux 中没有 mkdir -M 这个选项,正确参数是 -m(小写 m),它支持在创建目录时直接设定八进制权限值,但需注意:它只作用于最末级目录,不自动赋予整条路径统一权限。
明确 -m 的作用范围
-m 仅设置目标目录(最末级)的权限,上级父目录仍按系统 umask 创建。例如:
-
mkdir -p -m 750 /opt/app/logs→ 只有logs目录权限为drwxr-x---;/opt和/opt/app权限由 umask 决定(如 umask=0022,则为 755) - 若误以为整条路径都会变成 750,实际可能因上级目录权限过宽(如 755)导致安全风险
确保权限合法且可进入
目录必须含执行位(x),否则无法 cd 进入或列出内容。-m 后的八进制数须满足:
- 所有者位(第一位)建议含 x(即 ≥1),例如 7xx、6xx 不合法(6xx 缺少 x,内核会拒绝或报错)
- 常见安全组合:
700(仅属主)、750(属主+组)、770(属主+组可写执行) - 避免使用
777或644—— 后者是文件权限,不适用于目录
深层目录树的安全权限实现方式
要让整个路径(如 /a/b/c/d)都获得一致安全权限,不能单靠 -p -m 一步到位。可行做法有:
- 分步创建并逐级设权:
mkdir -m 700 /a && mkdir -m 700 /a/b && mkdir -m 700 /a/b/c && mkdir -m 700 /a/b/c/d - 先递归建好路径,再统一修正:
mkdir -p /a/b/c/d && chmod -R 700 /a/b/c/d(注意:-R 对目录树有效,但慎用于系统路径) - 用 shell 循环(适合脚本):
for d in /a /a/b /a/b/c /a/b/c/d; do mkdir -m 700 "$d"; done
验证是否生效
创建后立即检查最末级目录权限:
-
ls -ld /a/b/c/d—— 确认显示如drwx------(对应 700) - 不要依赖
ls -l /a/b/c查看上级,它们本就不受 -m 控制 - 若发现权限不符,检查是否拼错参数(如写成
-M)、权限值非法(如 644)、或当前用户对父目录无写权限











