在Linux和Unix操作系统上,所有新文件都是使用默认权限创建的。umask允许您查看或设置创建文件时使用的掩码模式,该掩码确定新创建的文件或目录的权限。mkdirtouchtee和其他创建文件和目录的命令都使用它。

在本教程中,我们解释了Linux权限模型读取权限,写入权限,执行权限以及使用umask命令为新创建的文件或目录设置权限位。权限的符号与数字表示法,创建文件与目录的默认权限,计算创建文件mask掩码值,通过mask计算创建文件与目录的权限,持久化创建文件mask掩码值。

Linux权限

在继续之前,让我们简短地解释一下Linux权限模型。在Linux中,每个文件都与一个所有者和一个组相关联,并为文件所有者,组成员,其他人分配权限。Linux有三种权限类型,分别是读取权限,写入权限,执行权限。

此概念使您可以指定允许哪些用户读取文件,写入文件或执行文件。要查看文件权限,请使用以下ls命令

ls -l dirname
drwxr-xr-x 12 myfreax users 4.0K Apr  8 20:51 dirname
|[-][-][-]    [------] [---]
| |  |  |        |       |       
| |  |  |        |       +-----------> Group 组名
| |  |  |        +-------------------> Owner 所有者名称
| |  |  +----------------------------> Others Permissions 其他人的权限
| |  +-------------------------------> Group Permissions 组的权限
| +----------------------------------> Owner Permissions 所有者的权限
+------------------------------------> File Type 文件类型

第一个字符代表文件类型,可以是常规文件-,目录d符号链接l或任何其他特殊类型的文件。

接下来的9个字符代表权限,每三个字符为一组。第一组显示所有者的权限,第二组显示组的权限,最后一组显示其他人的权限。

r用一个八进制值4代表读,w与一个八进制值2代表写,x用一个八进制值1代表可执行权限和,-用八进制值0的任何权限。还有其他三个特殊的文件权限类型:setuidsetgidSticky Bit

在上面的示例中,rwxr-xr-x表示所有者拥有读取,写入和执行权限rwx,组和其他用户具有读取和执行权限r-x

如果我们使用数字符号表示文件权限,所有者是rwx=4+2+1 = 7,组是r-x=4+0+1 = 5,其他人是r-x=4+0+1 = 5。我们将得出数字755

以数字符号表示时,权限可以具有三个或四个八进制数字0-7。第一位数字表示特殊权限,如果省略,则意味着未在文件设置特殊权限。在我们的情况下7550755 相同。第一位可以是4 代表 setuid2代表 setgid1代表Sticky Bit

可以使用chmod命令更改文件权限,并使用chown命令更改所有权

了解umask

默认情况下,在Linux系统上,针对文件的默认创建权限是666,它为用户,组和其他人授予读和写权限,对于目录则是777,对用户,组和其他人都有读,写和执行权限。Linux不允许创建具有可执行权限的文件。

可以使用umask命令修改默认的掩码模式,来改变创建文件与目录时的默认权限。umask仅影响当前的shell环境。在大多数Linux发行版中,系统默认的umask值在pam_umask.so/etc/profile文件中设置。

如果要基于每个用户指定mask掩码值,请编辑用户的Shell配置文件,例如~/.bashrc~/.zshrc。您还可以通过运行umask命令更改所需的值来改变当前会话值。要查看当前的mask掩码值,只需不带任何参数运行umask命令:

umask

输出将如下所示:

022

umask值会影响在新创建的文件和目录上权限位。正如我们已经提到的,文件的默认创建权限是666,目录是777。要计算新文件的权限位,请从默认值中减去umask值。

例如,要计算mask掩码值022,如何影响新创建的文件和目录权限。文件权限是666 - 022 = 644,所有者可以读取和修改文件。组和其他人只能读取文件。

目录权限是777 - 022 = 755,所有者可以进入目录并列出目录,读取,修改,创建或删除文件。组和其他人可以使用cd命令进入目录列出与读取文件。

您还可以使用-S选项以符号形式显示mask掩码值:

umask -S
u=rwx,g=rx,o=rx

与数字符号不同,符号展示的值就是新创建目录上要设置的权限。

设置mask掩码值

可以使用八进制或符号表示法设置mask掩码值。要使更改永久生效,请在全局配置文件(如/etc/profilefile)中设置新的mask掩码值,这将影响所有用户,或在用户的shell程序配置文件中~/.profile~/.bashrc~/.zshrc仅影响用户。用户文件的优先级高于全局文件。

在更改mask掩码值之前,请确保新值不会造成潜在的安全风险。限制值要比022应使用的限制要少,应格外小心。例如umask 000意味着任何人都将具有对所有新创建文件的读取,写入和执行权限。

假设我们要为新创建的文件和目录设置更多的限制性权限,这样其他人将无法使用cd访问目录和读取文件。我们需要的权限是目录750和文件640的权限。

要计算mask掩码值,只需从默认值中减去所需的权限。mask掩码值是 777-750 = 027。要在系统范围内永久设置mask掩码值,请使用你喜欢的文本编辑器打开文件/etc/profile。在本教程我们将使用vim打开文件

sudo vim /etc/profile

复制以下行粘帖到文件开头:

umask 027
/etc/profile

为了使更改生效,请运行以下source命令或注销并登录:

source /etc/profile

为了验证新设置,我们将使用mkdirtouch命令创建一个新文件和目录:

mkdir newdir
touch newfile

然后使用ls命令检查权限,您将注意到新文件具有640,目录具有750权限,如下所示:

drwxr-x--- 2 myfreax users 4096 Jul  4 18:14  newdir
-rw-r----- 1 myfreax users    0 Jul  4 18:14  newfile

设置创建文件掩码的另一种方法是使用符号表示法。例如umask u=rwx,g=rx,o=umask 027相同。

结论

在本教程中,我们解释了Linux权限以及如何使用umask命令为新创建的文件或目录设置权限位。更多相关信息,请在终端中输入man umask。如有任何疑问,请在下面发表评论。