1. 命令格式

umask 命令的格式非常简洁:

umask [-p] [-S] [mode]
  • mode (可选参数): 指定要设置的新权限掩码(umask值)。它可以有两种形式:

    • 数字模式 (Octal mode): 由 3 或 4 位八进制数字组成(例如 0022, 022, 0002)。
    • 符号模式 (Symbolic mode): 类似于 chmod 命令的符号格式(例如 u=rx, g=rx, o=)。
  • -S (选项): 以符号形式显示当前的 umask 值,而不是数字形式。这是一个非常有用的选项,使输出更易读。

  • -p (选项): 以可重用的格式输出。如果与 mode 参数一起使用,输出的形式可以直接作为命令再次执行。通常与 -S 一起使用。

如果不带任何参数和选项umask 命令会以数字模式显示当前的权限掩码。

2. 基本用法

umask 的主要作用是设置用户创建新文件或目录时的默认权限。它通过“屏蔽”(mask)掉不希望赋予的权限位来实现。

2.1 核心规则

  • 文件的默认最大权限是 666 (即 rw-rw-rw-)。
  • 目录的默认最大权限是 777 (即 drwxrwxrwx)。
  • 实际的默认权限 = 最大权限 减去 umask 值。

2.2 查看当前 umask

$ umask
0022
# 或者使用更易读的方式
$ umask -S
u=rwx, g=rx, o=rx

2.3 设置新的 umask

$ umask 002
# 再次查看
$ umask
0002
$ umask -Su=rwx, g=rwx, o=rx

3. 高级用法

3.1 在 Shell 配置文件中永久设置

直接在终端中设置的 umask 只在当前会话有效。要永久生效,需要将 umask 命令写入用户的 shell 配置文件中(如 ~/.bashrc, ~/.bash_profile, 或 ~/.zshrc)。

  • 编辑配置文件
nano ~/.bashrc   
  • 在文件末尾添加一行
umask 002  # 或者你偏好的值,例如 022    
  • 保存文件,然后运行 source 命令使其立即生效,或重新打开终端
source ~/.bashrc    

3.2 处理特殊权限位

umask 值通常有 3 位(如 022),但也可以有 4 位(如 0022)。第一位用于设置特殊权限的掩码。

  • 4 (SetUID):设置用户ID
  • 2 (SetGID): 设置组ID
  • 1 (Sticky Bit): 粘滞位
    例如,如果你想在设置 umask 的同时,确保新创建的文件不会继承 SetUID 位,你可以使用 4 位 umask:
$ umask 0022 
# 与 022 效果相同,第一位 0 表示不屏蔽任何特殊权限

3.3 在脚本中临时修改 umask

在自动化脚本中,如果你需要以非常严格的权限创建文件,可以在脚本开始时临时修改 umask,执行完操作后再恢复。

#!/bin/bash
# 保存旧的 umask
OLD_UMASK=$(umask)
# 设置一个非常严格的 umask (阻止组和其他用户的所有访问)
umask 077
# 执行文件创建操作
touch super_secret_file.txt
mkdir private_dir
# 操作完成后,恢复旧的 umaskumask 
$OLD_UMASK
echo "Done. Old umask restored."

4. 注意事项

4.1 umask 是掩码,不是权限

它是一个“要屏蔽掉的权限”的集合,而不是“要赋予的权限”。计算最终权限时用的是“减法”逻辑。

4.2 文件与目录的差异

因为文件的原始权限是 666,而 umask 022 会屏蔽掉 w 权限(对于组和其他用户),所以最终文件权限是 644 (rw-r--r--)。目录的原始权限是 777,减去 022 后是 755 (rwxr-xr-x)。

4.3 文件默认无执行权限

出于安全考虑,系统绝不会给新创建的文件默认赋予执行 (x) 权限。即使用 umask 000 创建文件,其权限也是 666,而不是 777

4.4 作用范围

umask 命令是 shell 内建命令,它只影响当前 shell 及其后续启动的进程(子进程会继承这个 umask 值)。修改它不会影响其他已经运行的 shell 或进程。

4.5 umask 与 ACLs

在现代 Linux 系统上,如果文件系统使用了 ACL(访问控制列表),umask 的行为可能会被覆盖。系统管理员可以配置默认的 ACL 规则,这些规则会优先于传统的 umask 设置来决定新文件的权限。如果你的 umask 设置似乎没有生效,检查一下目录是否设置了默认 ACL (getfacl <directory-name>)。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐