Linux中新建文件和目录的默认权限由umask控制,非chmod设置;其本质是按位屏蔽:文件起点666(无x)、目录起点777(必含x),实际权限=起点权限 & (~umask);如umask 002时,文件为664、目录为775;临时用umask命令,永久配置需写入~/.bashrc或/etc/login.defs等。

Linux 中新建文件和目录的默认权限不由 chmod 决定,而是由 umask(用户文件创建掩码)控制。它不是“设置权限”,而是从最大允许权限中按位屏蔽掉某些位——理解这点,才能避免改了却没效果的困惑。
umask 的计算逻辑:不是减法,是按位屏蔽
系统对新对象有固定起点权限:
- 目录永远从 777(rwxrwxrwx)开始,因为必须保留 x 位才能 cd 进入
- 普通文件永远从 666(rw-rw-rw-)开始,内核强制过滤执行位(x),所以新建文件绝不会带 x
实际权限 = 起点权限 & (~umask),即 umask 先取反,再与起点做按位与运算。例如 umask 002:
- 目录:777 & ~002 = 775(drwxrwxr-x)
- 文件:666 & ~002 = 664(rw-rw-r--)
虽然八进制下常可近似为“减法”,但本质是位运算——这也是为什么 umask 000 也无法让文件获得 x 权限。
临时设置:只影响当前终端会话
适合测试或单次操作,退出即失效,安全无风险:
- 运行 umask 002:协作场景常用,目录 775、文件 664
- 运行 umask 077:高隐私需求,目录 700、文件 600
- 验证是否生效:mkdir testd && touch testf && ls -ld testd testf
永久生效:按使用场景选对配置位置
普通用户日常登录:编辑 ~/.bashrc(或 ~/.zshrc 等,先查 echo $SHELL)末尾添加:
umask 002(团队共享)或 umask 077(个人主机)
保存后执行 source ~/.bashrc 立即生效。
新创建的系统用户:修改 /etc/login.defs 中的 UMASK 027 行(推荐生产环境值),仅影响后续用 useradd 创建的账号。
覆盖 su/sudo/cron/systemd 服务等非标准登录:必须配 PAM:
• Ubuntu/Debian:在 /etc/pam.d/common-session 加
session optional pam_umask.so umask=0027
• RHEL/CentOS:在 /etc/pam.d/system-auth 的 session 段加同上行
若提示找不到 pam_umask.so,需先安装 libpam-umask 包。
共享目录需要更细粒度?用默认 ACL 补 umask 不足
umask 是全局粗粒度控制。若某个目录(如 /srv/project)要求所有新文件自动继承特定组权限,需结合 ACL:
- 确认文件系统挂载时启用 acl(mount | grep $(df . -P | awk '{print $1}') | grep acl)
- 设置默认 ACL:setfacl -d -m g:developers:rwx /srv/project
- 此后在该目录下新建的子目录/文件,会自动获得 developers 组的 rwx 权限,且不受当前 umask 影响
注意:setfacl -d 不改变已有内容,只作用于未来创建的对象。


















