umask 003 新建文件权限是多少?减法会算错,按位与才是正解

一道 Linux 权限的经典考题:系统里 umask 的值是 003,此时新建一个文件,权限是什么?新建一个目录,权限又是什么?不少人脱口而出:文件就是 666 减 003,等于 663。答案错了——663 甚至不是一个合法的权限组合(末位的 3 代表写加执行,却没有读)。这道题真正要考的,就是藏在小减法里的那个陷阱。

为什么减法会翻车

很多人把 umask 的运算理解成十进制减法,这个直觉在多数值上侥幸成立,唯独 umask 某一位是奇数时就会露馅。003 的末位是 3,666−003 按十进制算会向前借位,得出 663;但权限的每一位是彼此独立的开关(读、写、执行三个比特),位与位之间根本不存在「借位」这回事。用算术减法去算一组按位独立的开关,出发点就错了。

正解:按位与

正确的算法一句话:新建对象的基准权限,按位与上 umask 的取反。

文件:666 & ~003。003 按九个权限比特取反得到 774,666 & 774 = 664,对应 rw-rw-r–。 目录:777 & 774 = 774,对应 rwxrwxr–。

对照着看:003 扣掉的是「其他用户」的写和执行两位,所以文件从 666 降到 664,目录从 777 降到 774——其他用户少了写(目录还少了进出的执行权),属主和属组原封不动。这才是 umask 003 的真实含义。

文件为什么从 666 起步

有人会问:目录的基准是 777,文件的基准为什么少一个执行位?这是系统的安全默认:新建文件默认不该带执行权限,防止一个普通数据文件稀里糊涂变成可执行的;真需要执行位,创建之后用 chmod 补上即可。记住「文件 666、目录 777」这对基准值,配合按位与,任何 umask 值都能口算出来。

umask 与 chmod 是两个方向

最后理一下两者的关系:umask 是出厂扣减,只作用于之后新建的对象,决定默认给多少;chmod 是后置修改,作用于已经存在的对象。想给某个文件加权限,用 chmod;想让以后新建的文件少带些权限,去调 umask——一个管未来,一个管存量,方向别搞反。

企业存储选型参考|贵州诚鑫致达

做中小企业全能主力存储,群晖机型参考:DS1823xs+ · DS2422+ · DS923+。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。