第六章-控制对文件的访问

解释Linux文件系统权限

Linux文件系统权限

​ 文件权限控制对文件的访问。Linux文件权限简单又灵活,能够应对大多数的常见权限情况。

​ 文件具有三个应用权限的用户类别。文件归某个用户所有,通常是文件的创建者。文件还归单个组所有,通常是创建改文件的用户的主要组,但是可以进行更改。

​ 您可以为所属用户(用户权限)、所属组(组权限),以及系统上非用户和非所属组成员的所有其他用户(其他权限)设置不通过的权限。

​ 最具体的权限具有优先权。用户权限覆盖组权限,后者有覆盖其他权限。

​ 举例说明成员资格如何促进用户之间协作。假设您的系统有两个用户:alice和bob。alice是alice和web组的成员,bob是bob、wheel和web组的成员。当alice和bob协作时,文件应当与web组关联,并且组权限应当允许这两个用户访问这些文件。

​ 有三种权限类别可应用:读取、写入和执行。下表说明了这些权限如何影响文件和目录的访问。

权限对文件和目录的影响

权限 对文件的影响 对目录的影响
r(读取) 可以读取该文件的内容 可以列出该目录下内容(文件名)
w(写入) 可以更改文件的内容 可以创建或删除目录中的任意文件
x(执行) 可以作为命令执行文件 目录可以成为当前工作目录。您可以允许cd进入这个目录,但还需要读取权限才能列出里面的文件。

​ 用户通常对只读目录具有读取和执行权限,因此他们可以进入该目录并列出该目录的内容。如果用户对目录仅具有读取访问权限,则可以列出其中文件的名称。但是,用户无法访问其他信息,如权限或时间戳。如果用户对目录具有仅执行权限,则无法列出目录中的文件名。如果他们知道自己有读取权限的文件名称,可以通过制定相对文件名称,从目录外访问该文件的内容。

​ 对目录拥有所有权或写入权限的任何人都可以删除其中的文件,不论文件的所有权或权限如何。您可以使用粘滞位权限覆盖此行为,稍后讨论。

注意:Linux文件权限的工作方式与Microsoft NTFS文件系统权限不同。在Linux上,权限仅适用于设置它们的文件或目录。目录内的子目录不会自动集成父目录的权限。但是,目录权限是可以阻止访问该目录的内容,具体取决于它们的限制程度。

查看文件和目录的权限及所有权

​ ls命令和-l选项可以显示有关权限和所有权的详细信息:

1
2
[redhat01@foundation0 ~]$ ls -l test 
-rw-r--r--. 1 redhat01 redhat01 0 May 20 17:51 test

​ 使用ls命令和-d选项可显示有关目录本身(而非其内容)的详细信息。

1
2
[redhat01@foundation0 ~]$ ls -ld /home
drwxr-xr-x. 6 root root 63 May 20 14:49 /home

​ 长列表的第一个字符表示文件类型,具体解释如下:

  • -:是常规文件
  • d:是目录
  • l:是符号链接
  • c:是字符设备文件
  • b:是块设备文件
  • p:是命名管道文件
  • s:是本地套接字

​ 接下来九个字符表示文件权限。这些字符解释为三组,每组三个字符:第一组是适用于文件所有者的权限,第二组适用于文件的组所有者,最后一组则适用于其他所有(全局)用户。如果一组内是rwx,说明该组具有读取、写入和执行全部三种权限。如果一组的一个字母被替换为-,则表示改组没有这个权限。

​ 在第一个示例中,用户redhat01的权限由第一组三个字符指定。redhat01用户对test文件具有读取和写入权限。第二组三个字符是redhat01组的权限;对test具有读取权限。第三组三个字符是所有其他用户的权限;对test具有读权限。

​ 应用最具体的权限组。因此,如果redhat01与组redhat01具有不同权限,二用户redhat01也是该组的成员,那么将使用用户的所有者权限。这样,从族中删除用户可能不切实际时,可以为用户设置比其他组成员资源更严厉的权限集。

权限影响示例

​ 以下示例说明文件权限的影响。对于这些示例,您的系统有四个具有以下组成员资格的用户:

用户 组成员资格
user01 user01、user04
user02 user02、user04
user03 user03、operator2
user04 user04、operator2
1
2
3
4
5
[root@foundation0 home]# id user01 user02 user03 user04 
uid=1001(user01) gid=1001(user01) groups=1001(user01),1004(user04)
uid=1002(user02) gid=1002(user02) groups=1002(user02),1004(user04)
uid=1003(user03) gid=1003(user03) groups=1003(user03),10001(operator2)
uid=1004(user04) gid=1004(user04) groups=1004(user04),10001(operator2)

​ 这些用户将使用dir目录中的文件。如下是改目录中文件的长列表:

1
2
3
4
5
6
7
8
[user02@foundation0 dir]$ ls -la
total 4
drwxrwxr-x. 2 user02 user04 70 May 21 11:16 .
drwxr-xr-x. 20 root root 4096 May 21 11:18 ..
-rw-rw-r--. 1 user01 user01 0 May 21 11:15 app1.log
-rw-r--rw-. 1 user01 consultantl 0 May 21 11:15 app2.log
-rw-rw-r--. 1 user02 consultantl 0 May 21 11:16 db1.conf
-rw-r-----. 1 user02 consultantl 0 May 21 11:16 db2.conf

​ ls 命令-a选项可显示隐藏文件的权限,包含用于表示目录及其父目录的特殊权限。在本示例中,.(点)特殊目录反映了dir本身的目录权限,而..(点点)特殊目录则反映了其父目录的权限。

​ 对于db1.conf文件,拥有该文件的用户(user02)具有读取、写入权限,但没有执行权限。拥有该文件的组(user04)具有读取和写入权限,但没有执行权限。所有其他用户具有读取权限,但没有写入和执行权限。

​ 下表探讨了这组权限对这些用户的一些影响:

影响 为什么会有此影响?
user01用户可以更改db1.conf文件的内容。 user01用户是consultantl组的成员,并且该组对db1.conf文件具有读取、写入权限。
user02用户可以查看和修改db2.conf文件的内容。 user02用户拥有db2.conf文件,并对其具有读取和写入访问权限。
user01可以查看db2.conf文件的内容,但不能修改其内容。 user01用户是consultantl组的成员,并且该组对db2.conf文件仅有读取、写入权限,无写入权限。
user03和user04用户没有对db2.conf的内容的任何访问权限。 other权限适用于user03和user04用户,并且这些权限不包括读取或写入权限。
user01用户是唯一能够更改app1.log文件内容的用户 仅有user01用户和user01组的成员对该文件具有写入权限,而其他用户没用该权限,而user01组的唯一组成员是user01用户。
user03用户可以更改app2.log文件的内容。 user03用户不是app2.log文件的所有者,也不是consultantl组成员,因此他仅适用于other权限,other权限具有读、写去权限。
user02用户可以查看app2.log文件的内容,但不能修改app2.log文件的内容。 user02用户是consultantl组的成员,并且该组对app2.log文件具有读权限,虽然other具有读、写权限。但是组的优先级大于other,所以会覆盖other的权限。
user02用户可以删除app1.log和app2.log文件。 user02用户对dir目录又有写入权限(如.(点)特殊目录所示),因此可以删除该目录中的任何文件。即使user02用户没有直接对文件具有写入权限,依然是可以进行删除的。

从命令行管理文件系统权限

更改文件和目录权限

​ chmod命令可从命令行更改文件和目录权限。chmod命令可以解释为“更改模式”,因为文件的模式是吻技安权限的另一个名称。chmod命令在要更改的文件或目录列表后面列出了权限说明。您可以通过符号或八进制(数字)表示法设置权限指令。

通过符号法更改权限

​ 使用chmod命令修改文件和目录权限。以下示例可以帮助您了解chmod命令的用法:

1
chmod who/what/which file|directory

​ who是用户的类,如下表所示。如果您不提供用户类,则chmod命令将使用all组作为默认值。

who 集合 描述
u user 文件所有者
g group 文件所属组成员
o other 既不是文件所有者也不是文件所属组成员的用户
a all 所有前面三组

​ what 是修改which的操作符,如下表中所示。

what 操作 描述
+ add 向文件添加权限。
- remove 从文件删除权限。
= set exactly 精确设置所提供的文件权限。

​ which是模式,指定文件或目录的权限,如下表所示。

which 模式 描述
r read 文件的读取权限。目录的列出权限。
w write 文件或目录的写入权限。
x(小写) execute 文件的执行权限。允许进入目录,以及访问该目录中的文件和子目录。
X(大写) special execute 目录的执行权限,或者文件的执行权限(如果是文件,则该文件需要至少有一个执行权限,否则不会生效)

​ 用于更改文件权限的符号使用字母代表不同的权限组:u表示用户,g表示组,o表示其他,a表示全部。

​ 使用符号法时,您不需要设置一组全新的权限。取而代之,您可以更改现有的一个或多个权限,或者使用等号(=)来替换一组权限的整个集合。

​ 权限自身由单个字母来表示:r表示读取,w表示写入,x表示执行。只有文件是目录或者以为用户、组或其他人设置了执行权限,您才可以使用大写X作为权限标志来添加执行权限。

​ 以下列表显示了使用符号方法更改权限的一些示例:

​ 对于document.pdf文件,为组和其他添加删除、读取和写入权限:

1
[root@foundation0 dir]# chmod go+rw document.pdf

​ 对于myscript.sh文件,为所有人添加执行权限:

1
[root@foundation0 dir]# chmod a+x myscript.sh

​ 您可以使用chmod命令-R选项,以递归方式对整个目录树中的文件设置权限。例如下一个命令的递归方式为拥有myfolder目录的组成员以及其中的文件和目录添加读取、写入和执行权限。

1
[root@foundation0 ~]# chmod -R g+rwx /root/myfolder/

​ 您还可以使用chmod命令-R选项以及X选项,以符号方式设置权限。使用chmod命令X选项,您可以对目录设置执行(搜索)权限,以便在不更改大部分文件权限的情况下,访问这些目录的内容。不过,使用X选项是要谨慎,因为如果某个文件设置有任何执行权限,则X选项也将会对该文件设置指定的执行权限。

​ 例如,以下命令会以递归方式为组所有者设置对demodir目录及其所有子文件和目录的读、写权限,但将仅向以为用户、组或其他目录设置了执行权限的目录和文件应用组执行权限。

1
[root@foundation0 ~]# chmod -R g+rwX demodir/

通过八进制法更改权限

​ 您可以使用chmod命令,通过八进制法(而非符号法)来更改文件权限。在以下实例中,#字符代表以为数字。

1
chmod ### file|directory

​ 如果使用八进制法,您可以用三位(火灾设置高级权限时为四位)八进制数来表示权限。单个八进制数字可以表示0-7的任何单个值。

​ 在权限的三位八进制表示法中,每一位数字表示一个访问级别,从左至右为:用户、组和其他。要确定每个数字:

  • 从0开始。
  • 如果要为此访问级别添加读取权限,请加4。
  • 如果要添加写入权限,请加2。
  • 如果要添加执行权限,请加1。

​ 有经验的管理员通常使用八进制权限,因为它们更容易对单个或匹配的文件实施权限变更。并且仍然提供完整的权限控制。

​ 以下列表显示了使用八进制法更改权限的一些示例:

​ 对于sample.txt文件,为用户设置读取和写入权限,并为组和其他人设置读取权限。

1
[root@foundation0 demodir]# chmod 644 sample.txt

​ 对sampledor目录,为用户设置读取、写入和执行权限,为组设置读取和执行权限,而为其他人设置权限。

1
[root@foundation0 demodir]# chmod 750 sampledor

更改文件和目录的用户或组所有权

​ 用户拥有其创建的文件。默认情况下,新文件的组所有权为创建该文件的主要用户组。在RedHat Linux 中,用户的主要组通常为仅有该用户作为成员的私有组。要根据组成员资格授予文件的访问权限,可能需要更改拥有该文件的组。

​ 只有root用户能够更改拥有文件的用户。但是,文件的所有者和root用户可以设置组所有权。root用户可以将文件所有权授予任何组。但只有普通用户是目标组的成员才能更改文件的组所有权。

​ 您可以使用chown(更改所有者)命令更改文件所有权。例如,要将app.conf的所有权授予user01用户,您可以使用以下命令:

1
[root@foundation0 demodir]# chown user01 app.conf

​ chown命令 -R 选项可以递归更改整个目录树的所有权。以下命令可将Pictures目录以及其下的所有文件和子目录的所有权授予给user01用户:

1
[root@foundation0 demodir]# chown -R user01 Pictures

​ 也可以使用chown命令更改文件的组所有权,只需要在组名称之前加上冒号(:)。例如,以下命令将Pictures目录的组所有权更改为user02:

1
[root@foundation0 demodir]# chown :user02 Pictures

​ 您可以使用chown命令也可以同时更改所有者和组,使用owner:group语法即可。例如,要将Pictures目录的所有权更改到user03用户,同时将组所有权更改为user04,可以使用以下命令:

1
[root@foundation0 demodir]# chown user03:user04 Pictures

​ 有些用户并不使用chown命令,而是使用chgrp命令来更改组所有权。该命令的作用与chown类似,不同之处在于,您只能用它来更改组所有权,而组名前也不需要加冒号(:)。

重要:您可能会遇到chown用句点而不是冒号来分割所有者和组的情况:

1
[root@foundation0 demodir]# chown user03.user04 Pictures

虽然同样可以更改成功,但RedHat官方不建议使用此语法,而应始终使用冒号。因为句点是用户名中有效的字符,因此chown命令可能会误解您的意图。同时命令可能会将用户和组解释为文件名。取而代之,仅可在同时设置用户和组时使用冒号字符。

管理默认权限和文件访问

特殊权限

​ 特殊权限是除了基本用户、组和其他类型之外的第四种特权类型。顾名思义,特殊权限提供了额外的访问相关功能,超出了基本权限类型允许的范畴。本章节介绍特殊权限的影响,具体参见下表的总结。

特殊权限对文件和目录的影响

权限 对文件的影响 对目录的影响
u+s(suid) 以拥有文件的用户身份,而不是以允许文件的用户身份执行文件。 无影响。
g+s(sgid) 已拥有文件的组身份执行文件。 目录中创建的文件的组所有者与目录的组所有者相匹配。
o+t(sticky) 无影响。 对目录具有写入访问权限的用户仅可以删除其所拥有的文件,而无法删除或强制保存到其他用户所拥有的文件。

​ 对可执行文件的setuid权限表示,将以拥有该文件的用户的身份运行命令,而不是以运行命令的用户身份,以passwd为例:

1
2
[user01@foundation0 demodir]$ ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 32648 Aug 10 2021 /usr/bin/passwd

​ 在长列表中,您可以通过小写的s字符辨别出setuid权限,此处通常是x字符(所有者执行权限)。如果所有者不具有执行权限,这个字符将由大写的S字符取代。

1
2
3
4
5
6
7
8
# 如该文件所有者的执行权限x是存在的
[root@foundation0 bin]# ls -l passwd
-rwxr-xr-x. 1 root root 32648 Aug 10 2021 passwd
# 此时为所有者设置setuid权限
[root@foundation0 bin]# chmod 4755 passwd
# 则x将替换为小写的s,表示该文件具有执行权限以及setuid权限
[root@foundation0 bin]# ls -l passwd
-rwsr-xr-x. 1 root root 32648 Aug 10 2021 passwd
1
2
3
4
5
6
7
8
# 假设当前文件所有者无该x权限。
[root@foundation0 bin]# ls -l passwd
-rw-r--r--. 1 root root 32648 Aug 10 2021 passwd
# 此时为所有者无x权限去设置setuid权限
[root@foundation0 bin]# chmod 4644 passwd
# 则由大写的S取代。
[root@foundation0 bin]# ls -l passwd
-rwSr--r--. 1 root root 32648 Aug 10 2021 passwd

​ 对于目录的setgid特殊权限,表现在该目录中创建的文件将继承该父目录的组所有权,而不是从创建用户继承组所有权。此功能通常用于协作目录,将文件从默认的私有组自动更改为共享组,或者当文件始终都应由特定的组所使用时使用。这种行为的一个示例是/run/log/journal目录:

1
2
[root@foundation0 bin]# ls -ld /run/log/journal/
drwxr-sr-x+ 3 root systemd-journal 60 May 22 09:41 /run/log/journal/

​ 如果对可执行文件设置了setgid,则命令将以拥有该文件的用户的身份运行,而不是运行命令的用户身份。此情况类似于setuid的工作方式。以locate命令为例:

1
2
[root@foundation0 bin]# ls -l /usr/bin/locate 
-rwx--s--x. 1 root slocate 41032 Aug 10 2021 /usr/bin/locate

​ 在长列表中,您可以通过小写的s字符来表别出setgid,此处通常是x字符(组执行权限)。如果组不具有执行权限,这个字符将由大写的S字符取代。

​ 最后,针对目录的粘滞位将对目录中的文件删除设置特殊限制。只有文件的所有者(及root用户)才能删除该目录中的文件。一个示例是/tmp目录:

1
2
[root@foundation0 bin]# ls -ld /tmp/
drwxrwxrwt. 21 root root 4096 May 22 16:17 /tmp/

​ 在长列表中,您可以通过小写的t字符辨别出粘滞位权限,此处通常是x字符(其他人执行权限)。如果其他人不具备执行权限,这个字符将由大写的T字符取代。

设置特殊权限

  • 符号:setuid=u+s;setgid=g+s;粘滞位=o+t
  • 八进制:添加在三个序位前;setuid=4;setgid=2;粘滞位=1

​ 特殊权限示例通过使用符号法在example目录中添加setgid位:

1
2
3
4
5
[root@foundation0 ~]# ls -ld example/
drwsr-xr-x. 2 user02 user04 6 May 22 17:09 example/
[root@foundation0 ~]# chmod g+s example/
[root@foundation0 ~]# ls -ld example/
drwsr-sr-x. 2 user02 user04 6 May 22 17:09 example/

​ 通过使用符号法删除example目录上的setuid

1
2
3
4
5
[root@foundation0 ~]# ls -ld example/
drwsr-sr-x. 2 user02 user04 6 May 22 17:09 example/
[root@foundation0 ~]# chmod u-s example/
[root@foundation0 ~]# ls -ld example/
drwxr-sr-x. 2 user02 user04 6 May 22 17:09 example/

​ 使用八进制法,对example目录设置setgid位,并为用户和组添加读取、写入和执行权限,但其他用户不具备任何访问权限:

1
2
3
4
5
[root@foundation0 ~]# ls -ld example/
drwxr--r--. 2 user02 user04 6 May 22 17:09 example/
[root@foundation0 ~]# chmod 2770 example/
[root@foundation0 ~]# ls -ld example/
drwxrws---. 2 user02 user04 6 May 22 17:09 example/

​ 使用八进制法,对example目录删除setgid位,并未用户和组添加读取、写入和执行权限,但其他人不具备任何访问权限。请注意,使用八进制法删除特殊权限时,您需要在权限值的开头添加额外的0:

1
2
3
4
5
[root@foundation0 ~]# ls -ld example/
drwxrws---. 2 user02 user04 6 May 22 17:09 example/
[root@foundation0 ~]# chmod 00770 example
[root@foundation0 ~]# ls -ld example
drwxrwx---. 2 user02 user04 6 May 22 17:09 example

默认文件权限

​ 在创建时,文件被分配初始权限。有两个因素会影响这些初始权限。其一是您要创建的是常规文件还是目录。其二是当前的umask,它代表用户文件创建掩码。

​ 如果创建目录,则其初始八进制权限为0777(drwxrwxrwx)。如果您创建常规文件,则其初始八进制权限为0666(-rw-rw-rw-)。必须始终不为常规文件添加执行权限。这一步可使攻击者更难破坏系统,创建和运行恶意文件

​ 此外,shell会话会设置umask,进一步限制文件的初始权限。umask是一个八进制位掩码,可以清除由进程创建的新文件和目录的权限。如果在umask中设置了一个位,则新文件中的对应的权限将被清楚。例如,umask 0002 可清楚其他用户的写入位。前导零表示特殊权限、用户和组权限未被清楚。umask为0077时,清楚新创建文件的所有组和其他权限。

​ 不带参数运行umask命令可显示当前shell的umask值:

1
2
[root@foundation0 ~]# umask 
0022

​ 通过一个八进制参数使用umask命令,可以更改当前shell的umask。该参数应当是与新umask值对应的八进制值。umask中第一个特殊权限的前导零均可以省略。例如,umask 077与umask 0077相同。

​ Bash shell用户的系统默认 umask值在 /etc/login.defs和/etc/bashrc文件中定义。普通用户可以在其主目录的 .bash_profile 或 .bashrc 文件中覆盖系统默认值。

重要:在RedHat Linux 8和更早的版本中,如果用户账户的UID为200或更大的值,并且用户名和账户的主要组相同,则默认的umask为0002.否则,其默认的umask为0022.

红帽RedHat Linux 9正更改了这一设定,所有账户的umask都为0022。当您启动登录shell时,您的umask为0022。但是,当您启动交互式非登录shell时(例如当您在图形UI中启动gnome-terminal时),如果您账户的UID为200或更大值,并且您的主要组与您的用户账户同名,则您的umask为0002。未来RedHat会将所有用户都更改为同样的0022。

image-20250522182353825

image-20250522182245664

umask使用程序对权限的影响

​ 以下示例说明umask如何影响文件合目录的权限。查看当前shell中文件和目录的默认umask权限。重要:假设umask当前值为0022。

​ 如果您创建常规文件,则其初始八进制权限为0666(二进制表示为 000 110 110 110)。然后0022的umask(000 000 010 010)将禁用组合其他对象的写入权限位。因此,所有者对文件具有读取和写入权限,组合其他对象设置为读取权限(000 110 100 100).

1
2
3
4
5
[kiosk@foundation0 ~]$ umask 
0022
[kiosk@foundation0 ~]$ touch test.txt
[kiosk@foundation0 ~]$ ls -l test.txt
-rw-r--r--. 1 kiosk kiosk 0 May 23 14:40 test.txt

​ 如果创建目录,则其初始的八进制权限为0777(000 111 111 111).然后umask为0022(000 000 010 010)将禁用组和其他对象的写入权限位。因此所有者对目录具有读取、写入和执行权限,组合其他对象设置为读取和执行权限(000 111 101 101)。

1
2
3
4
5
[kiosk@foundation0 ~]$ umask 
0022
[kiosk@foundation0 ~]$ mkdir default
[kiosk@foundation0 ~]$ ls -ld default/
drwxr-xr-x. 2 kiosk kiosk 6 May 23 14:44 default/

​ 通过将umask值设置为0,其他用户的文件权限将从读取改为读取和写入。其他用户的目录权限将从读取和执行改为读取、写入和执行。

1
2
3
4
5
6
7
[kiosk@foundation0 ~]$ umask 0
[kiosk@foundation0 ~]$ touch zero.txt
[kiosk@foundation0 ~]$ ls -l zero.txt
-rw-rw-rw-. 1 kiosk kiosk 0 May 23 17:21 zero.txt
[kiosk@foundation0 ~]$ mkdir zero
[kiosk@foundation0 ~]$ ls -ld zero
drwxrwxrwx. 2 kiosk kiosk 6 May 23 17:22 zero

​ 要屏蔽其他用户的所有文件和目录权限,请将umask值设置为007。

1
2
3
4
5
6
7
[kiosk@foundation0 ~]$ umask 007
[kiosk@foundation0 ~]$ touch seven.txt
[kiosk@foundation0 ~]$ ls -l seven.txt
-rw-rw----. 1 kiosk kiosk 0 May 23 17:23 seven.txt
[kiosk@foundation0 ~]$ mkdir seven
[kiosk@foundation0 ~]$ ls -ld seven
drwxrwx---. 2 kiosk kiosk 6 May 23 17:23 seven

​ umask为027可确保用户对新文件具有读写权限,组具有读取权限。组对新目录具有读取和执行权限,而其他用户则没有任何权限。

1
2
3
4
5
6
7
[kiosk@foundation0 ~]$ umask 027
[kiosk@foundation0 ~]$ touch two-seven.txt
[kiosk@foundation0 ~]$ ls -l two-seven.txt
-rw-r-----. 1 kiosk kiosk 0 May 23 17:27 two-seven.txt
[kiosk@foundation0 ~]$ mkdir two-seven
[kiosk@foundation0 ~]$ ls -ld two-seven
drwxr-x---. 2 kiosk kiosk 6 May 23 17:28 two-seven

更改默认权限

​ 在RedHat Linux 9中,/etc/logindefs文件为用户设置默认的umask。默认情况下,其umask行指定的默认umask为0022。

​ 在RedHat Linux 9.0和9.1中,这只影响登录shell。如果您启动新的终端窗口或以其他方式启动交互式飞登录shell,/etc/bashrc中的设置仍然适用。对于这些shell,如果账户UID为200或更大值,并且用户名和主要组名相同,就会向账户分配一个值为0002的umask。否则,其umask为0022。

​ root用户可以通过在/etc/profile.d/目录中添加local-umask.sh的shell启动脚本来更改交互式非登录shell的默认umask。以下示例显示了一个local-umask.sh文件。

image-20250523175818661

​ 对于UID大于199且用户名和主要组相匹配的用户,上面的示例会将umask设置为0007,其余全部设置为0022。(前导零可以省略)如果想将所有人的umask都设置为0022,可以使用以下内容创建该文件。

总结:交互式非登录bashrc生效,交互式登录bash_profile生效。

​ 可以通过shopt login_shell验证是否是登录还是非登录,如果为on则表示当前是登录式,off则是非登录式

1
2
[kiosk@foundation0 ~]$ shopt login_shell 
login_shell on