mkdir -m可一步创建目录并精确设置八进制权限,它绕过umask直接写入目标权限值,仅作用于末级目录,必须用三位八进制数(如755),且目录需含执行位(x)方可进入。

直接用 mkdir -m 就能一步到位创建目录并设定精确权限位,无需后续 chmod。关键在于理解 -m 后跟的不是“掩码”,而是**目标权限值**——它绕过 umask,强制赋予你指定的八进制权限位。
mkdir -m 的本质:跳过 umask 的直设模式
mkdir -m 的 mode 参数是最终生效的权限值,不是 umask。比如:
-
mkdir -m 700 secret→ 目录权限就是drwx------(所有者全权,组和其他人无任何权限) -
mkdir -m 750 appdata→ 权限为drwxr-x---(所有者可读写执行,组可读执行,其他人无权限) -
mkdir -m 644 docfile→ ❌ 错误!mkdir创建的是目录,而644不含执行位(x),目录必须有 x 才能进入;系统会自动补上执行位,实际创建为drw-r--r--?不,Linux 内核会拒绝这种非法组合,mkdir -m 要求至少对所有者有 x 权限,否则报错或静默调整(行为依赖实现,但安全起见请始终包含 x)。
正确设置权限位的三个要点
要让 -m 真正按你预期工作,注意以下细节:
-
必须使用三位八进制数(如
755、700),不能写成符号形式(如u=rwx,g=rx,o=);mkdir -m不支持符号模式 -
目录权限中,“执行位(x)”不可省略:对所有者建议保留
x(否则无法 cd 进入);组和其他人的x按需开启(决定是否允许进入该目录) -
与 -p 组合使用完全兼容:例如
mkdir -p -m 750 logs/app/error会逐级创建,并确保error目录权限为750;注意:只有最末级目录获得-m指定权限,上级目录仍按默认(即777 & (~umask))创建
对比 umask:为什么 -m 更可控
默认情况下,mkdir dir 的权限由系统 umask 决定(如 umask 0022 → 实际得 755)。但 umask 是全局策略,影响所有新建文件/目录。而 -m 是显式覆盖:
- 即使当前 umask 是
0002,mkdir -m 700 tmp依然生成drwx------ - 它不参与位运算,也不受内核过滤执行位的影响(因为它是目录,x 本就是合法且必需的)
- 适合脚本中精准控制敏感目录(如
/var/run/myapp、$HOME/.cache/private)
实用示例:一步到位建私有配置目录
假设你要为某服务创建运行时目录,要求仅属主可访问:
mkdir -p -m 700 /opt/myapp/{run,cache,config}
这条命令会:
- 递归创建
/opt/myapp/run、/opt/myapp/cache、/opt/myapp/config - 确保每个末级目录权限均为
700(drwx------) - 上级目录(如
/opt/myapp)按当前 umask 创建(通常为755),不影响安全性











