目录

一、Linux文件系统权限解析

1.1.常见的基本权限

1.1.1.基本权限的符号表示模式

1.1.2.基本权限的绝对模式表示

1.1.3.更改文件访问权限

1.1.3.1.用户实体符号表示

1.1.3.2.更改用户权限

方式一:chmod 用户类型 +/-/=权限类别  文件名

方式二:chmod 绝对模式 文件名

1.2.linux系统中的特殊权限

1.2.1.设置特殊权限(语法规则)

1)符号法

2)八进制法

1.2.2.示例

1.2.3.特殊权限一览表

1.3.特殊权限实验测试

1.3.1.实验前准备

1)创建测试用户

2)设置密码

3)创建实验目录

1.3.2.u + s场景

1)查看一个已有suid的例子,系统自带

2)创建一个测试程序

3)查看普通用户执行效果

4)设置SUID后再测试

1.2.2.g + s场景

1)创建共享目录并设置SGID

2)将testuser1和testuser2加入组

3)测试,未设置SGID时(对比)

4)测试设置SGID 的teamdir目录

1.2.3.o + s场景

1)创建共享目录并设置Sticky Bit

2)分别用两个用户创建文件

3)测试:删除别人的文件(应该会提示失败)

4)删除自己的文件

二、更改文件属主/属组关系

2.1.chown命令

1)既改属主、也改属组

2)只改属主

3)只改属组

2.2.chgrp命令

三、基本权限ACL(Access Control List)

3.1.基本权限ACL的诞生?

3.2.基本权限ACL和UGO权限有什么不同?

3.2.1.查看文件有哪些acl权限

3.2.2.设置用户bob权限

3.2.3.查看ACL

3.2.4.删除ACL

1)删除部分acl权限

2)删除所有acl权限

3.2.5.场景示例

1)为特定用户添加权限

2)为特定组添加权限

3)递归设置目录及其子内容的acl

4)设置默认ACL(新文件自动继承权限)

5)删除指定用户/组的ACL权限

6)清除所有ACL规则


一、Linux文件系统权限解析

1.1.常见的基本权限

Linux 采用 UGO 模型(User, Group, Other)定义权限,通过赋予某个用户或组能够以何种方式访问某个文件或文件夹(存放图片文件、视频文件、普通文件),从而实现了用户的访问隔离。即每个文件/目录的权限分为三类主体,即分别是:

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

属主(User):文件所有者

属组(Group):文件所属组的成员

其他人(Other):既不是文件所有者也不是文件所属组成员的用户

所有人(ALL = U + G + O)即所有前面三组

例如:

其中,最后的 .:表示文件启用了SELinux安全上下文(或其他扩展属性)

1.1.1.基本权限的符号表示模式

Linux文件系统的权限管理中,将访问权限分为三种类型,分别是可读(Read)、可写(Write)、可执行(excute----x/X),三种基本的权限分别有不同的访问权限:

权限类别 可访问范围

允许操作:

查看文件内容:cat filename、less filename、head filename 等。
复制文件:cp filename /path/to/dest(需目标目录有写权限)。
统计文件信息:wc filename(行数、字数)、md5sum filename(校验和)。


限制:

无法修改内容(如 vim filename 编辑后无法保存)。
无法执行文件(即使是可执行程序,无 x 权限时会提示“权限被拒绝”)。

允许操作:

修改文件内容:vim filename、echo "text" >> filename(追加)、sed -i 's/old/new/g' filename(替换)。
截断文件:> filename(清空内容)。
重命名文件本身(需文件所在目录有 w 权限,注意:文件名属于目录的元数据,与文件自身权限无关)。

限制:

无 r 权限时,无法直接查看内容(但可通过覆盖式写入修改内容,如 echo "new" > filename)。
无 x 权限时,无法执行文件(如脚本、二进制程序)。

执行

允许操作:

运行可执行文件:
二进制程序(如 /bin/ls):直接执行 ./program 或通过绝对路径执行。
脚本文件(如 .sh、.py):需文件首行指定解释器(如 #!/bin/bash),然后执行 ./script.sh。
作为命令在 PATH 路径中调用(如 ls 实际执行 /bin/ls,需 /bin 在 PATH 中且 ls 有 x 权限)。


限制:

无 r 权限时,无法读取脚本内容(但可执行,如二进制程序或被加密的脚本)。
仅对可执行文件有效(纯文本文件设置 x 权限无意义,执行时会报错“无法执行二进制文件”)。

注释:

File Type:文件类型,通常- 代表普通文件(其他常见类型:d目录、l链接、b块设备等),

User:文件所有者的权限

Group:文件所属组的权限

Other User:其他用户

整体权限对文件和目录的影响概要表

权限 对文件的影响 对目录的影响
r(读取) 可以读取文件内容 可以列出目录的内容(文件名)
w(写入) 可以更改文件内容 可以创建或删除目录中的任一文件
x(执行) 可以作为命令执行文件 目录可以成为当前工作目录。可以运行cd进入这个目录,但还需要读取权限才能列出里面的文件
X(特殊执行) 为目录添加执行权限 目录的执行权限。或则文件的执行权限(如果该文件具有至少一个执行粘滞位)

1.1.2.基本权限的绝对模式表示

编号(编号越大,权限越小,外国人喜欢大的表示小的,例如M就表示分钟,m就表示月份) 权限
4
2
1 执行

文件权限分为读、写和执行三种。每种状态都分为允许/不允许两种状态值,我们需要三位二进制数就可以表达出所有的状态组合。

执行 对应的八进制
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

1.1.3.更改文件访问权限

1.1.3.1.用户实体符号表示

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

符号 含义
u 文件或目录的所有者
g 同一组的成员
o 其他所有用户
a 所有用户
1.1.3.2.更改用户权限

Linux中可以允许管理员使用命令chmod(change mode)来更改文件的访问权限,并且可以通过以下的两种方式进行:

方式一:chmod 用户类型 +/-/=权限类别  文件名

用户类型分别是前面提到的,ugo或则a

+添加权限

-代表撤销

=授予权限

权限类别即可读,可写,可执行

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

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

方式二:chmod 绝对模式 文件名

绝对模式,即使用八进制数字分别来对ugo的访问权限做管理

案例: 

第一步:创建test.txt文件,并添加echo "hello world"

练习一:让所有人都只有读写的权限

chmod a=wr test.txt

练习二:为文件的所有者添加执行权限

chmod u+x test.txt

练习三:让其他用户也有执行权限(拥有执行权限文件名颜色通常会变蓝)

chmod o+x test.txt

练习四:使用绝对模式来对文件进行赋权,需求为:让文件所有者拥有可读、可写、可执行权限,文件所有组拥有可读可写权限,其他用户责拥有读权限

分析:

u ---> 可读(4)+ 可写(2)+ 可执行(1) = 7

g ---> 可读(4)+ 可写(2) = 6

o ---> 可读(4) = 4

chmod 764 test.txt

练习五:取消其他用户的所有权限

chmod o-rwx text.txt

chmod 760 text.txt

1.2.linux系统中的特殊权限

Linux中的特殊权限有点坑,早些时候在部署Oracle集群的时候,其中就遇到了权限问题,最终排查的结果就是由于特殊权限(u + s)没给到,倒是共享盘无法被识别!!!!!

Linux操作系统中的特殊权限是除了基本用户、组和其他类型之外的第四种权限类型。顾名思义,特殊权限提供了额外的访问相关功能,超出了基本权限类型允许的范畴。

1.2.1.设置特殊权限(语法规则)

1)符号法

        setuid=u+s;setgid=g+s;粘滞=o+t

2)八进制法

        在添加的第三个前序位;setuid=4;setgid=2;粘滞=1

1.2.2.示例

通过使用符号法在example目录中添加setgid位:

        chmod g+s example

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

        chmod u-s example

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

        chmod 2770 example

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

        chmod 0770 example

1.2.3.特殊权限一览表

特殊权限的影响,具体参见下表中的总结:

特殊:special

粘滞:sticky

权限 对文件的影响 典型场景 对目录的影响
u + s(suid) 当一个可执行文件设置了 SUID 权限后,任何用户(即使是普通用户)执行该文件时,都会临时获得该文件所有者(通常是 root)的权限

最常见的就是 /bin/passwd 命令。

普通用户需要修改自己的密码,密码存储在 /etc/shadow 文件中。

这个文件只有 root 用户才有权写入。

为了让普通用户也能修改密码,/bin/passwd 文件被设置了 SUID 权限,其所有者为 root。

当普通用户执行 passwd 命令时,会临时以 root 身份运行,从而能够修改 /etc/shadow 文件。

SUID 只对二进制可执行文件有效,对 Shell 脚本无效(出于安全考虑,现代 Linux 内核会忽略脚本上的 SUID)。

这是一个高风险权限。如果一个程序设置了 SUID 且有安全漏洞,攻击者可能利用它获得 root 权限。因此,绝对不要随意给程序(如 vim、bash)设置 SUID。

g + s(sgid)

情况 A:设置在可执行文件上(类似 SUID)
作用:任何用户执行该文件时,都会临时获得该文件所属组的权限。

情况 B:设置在目录上(更常用,重要)
作用:当一个目录被设置了 SGID 后,任何用户在该目录下创建的新文件和子目录,其所属组会自动继承该目录的所属组,而不是用户自己的默认组。

情况A:典型场景:某些需要访问特定硬件设备或系统文件的命令,如 /bin/umount。

情况B:典型场景:团队协作共享目录。
假设有一个 /data/team 目录,所属组是 teamgroup,并设置了 SGID。
用户 alice 和 bob 都是 teamgroup 的成员。
无论谁在这个目录下创建新文件,该文件的所属组都会自动变成 teamgroup,这样团队成员之间就能方便地互相读写文件,而不需要 chmod 777。

目录中创建的文件的组所有者与目录的组所有者相匹配。存在继承的关系。
o + t(sticky) 当一个目录被设置了 Sticky Bit 后,只有文件的所有者、目录的所有者或 root 用户才能删除或重命名该目录下的文件。其他用户,即使对该目录有写权限,也无法删除不属于自己的文件。

最常见的就是 /tmp 目录。

/tmp 是所有用户共享的临时目录,权限通常是 1777(即 drwxrwxrwt)。

如果没有 Sticky Bit,任何用户都可以删除其他用户在 /tmp 下创建的文件,这会造成混乱和安全问题。

有了 Sticky Bit,用户 alice 只能删除她自己创建的文件,而无法删除 bob 的文件。

对目录具有写入访问权限的用户仅可以删除其拥有的文件,而无法删除或强制保存到其他用户所拥有的文件。

1.3.特殊权限实验测试

1.3.1.实验前准备

1)创建测试用户

useradd testuser1

useradd testuser2

2)设置密码

passwd testuser1

passwd testuser2

3)创建实验目录

mkdir -p /tmp/lab

chmod 755 /tmp/lab

cd /tmp/lab

1.3.2.u + s场景

理解 SUID 如何让普通用户临时拥有文件所有者的权限。

1)查看一个已有suid的例子,系统自带

ls -l /bin/passwd

2)创建一个测试程序

# 编写一个简单的 C 程序,用于显示当前用户的 UID
cat > /tmp/lab/showuid.c << 'EOF'
#include <stdio.h>
#include <unistd.h>
int main() {
    printf("真实用户ID (UID): %d\n", getuid());
    printf("有效用户ID (EUID): %d\n", geteuid());
    return 0;
}
EOF

# 编译程序
gcc -o /tmp/lab/showuid /tmp/lab/showuid.c

3)查看普通用户执行效果

# 切换到 testuser1

/tmp/lab/showuid

可以看到UID和EUID相同,都是testuser1。

4)设置SUID后再测试

chmod u+s /tmp/lab/showuid

结果:有效用户ID变成了0(root),说明testuser1执行时临时获取了root权限。

在长列表中,通常使用小写的s字符辨别出是否具有setuid权限。

1.2.2.g + s场景

理解 SGID 如何让目录下的新文件自动继承目录的所属组,方便团队协作。

1)创建共享目录并设置SGID

# 创建目录

mkdir /tmp/lab/teamdir

# 创建测试组

groupadd teamgroup

chown root:teamgroup /tmp/lab/teamdir

# 设置SGID

chmod g+s /tmp/lab/teamdir

# 查看权限(注意所属组的 x 变成了 s)

ls -ld /tmp/lab/teamdir

2)将testuser1和testuser2加入组

usermod -aG teamgroup testuser1

usermod -aG teamgroup testuser2

3)测试,未设置SGID时(对比)

# 先创建一个普通目录,不设置SGID

mkdir /tmp/lab/normaldir

chown root:teamgroup /tmp/lab/normaldir

# 创建testuser1文件

su - testuser1

touch /tmp/lab/normaldir/file1

ls -l /tmp/lab/normaldir/file1

可以注意到在未设置SGID的时候,用户该用户在该目录下创建的文件归宿也是testuser1,而不是teamgroup。

4)测试设置SGID 的teamdir目录

结果:可以注意到file2的文件归所组已经切换为teamgroup,即目录的所属组。

1.2.3.o + s场景

理解 Sticky Bit 如何防止用户删除不属于自己的文件。

1)创建共享目录并设置Sticky Bit

# 创建目录,所有用户都有写权限

mkdir /tmp/lab/shared

chmod 777 /tmp/lab/shared

# 设置Sticky Bit

chmod o+t /tmp/lab/shared

# 查看权限(留意其他人的x变成了t)

ls -ld /tmp/lab/shared

2)分别用两个用户创建文件

# 使用testuser1创建一个测试文件

su - testuser1

touch /tmp/lab/shared/file_a.txt

# 使用testuser2也创建一个测试文件

su - testuser2

touch /tmp/lab/shared/file_b.txt

3)测试:删除别人的文件(应该会提示失败)

4)删除自己的文件

二、更改文件属主/属组关系

2.1.chown命令

chown命令来源于(change owner),它用于配置一个文件属于谁、属组权。

1)既改属主、也改属组

语法:chown [-R] 用户名:组名 文件,也可以单独使用 chown 或 chgrp分别进行执行。不同之处在于,chgrp只能用它来更改组所有权,而且组名称前也不需要加冒号(:)。

在Linux系统中,chown -R 用户名.组名 使用 . 也能够执行通过,这是因为 chown 命令支持使用点号 . 代替冒号 : 作为用户与用户组的分隔符,但不推荐。

-R代表:递归(-R)将当前目录(.)下所有文件和子目录的所有者修改为 mysql 用户

示例1:

示例2:

2)只改属主

语法:chown 属主名 文件

3)只改属组

语法:chown .属组名 文件

案例:

第一步:创建两个用户分别时develop_user01、develop_user02

语法:useradd develop_user01/develop_user02

练习一:在develop_user01用户下创建一个脚本文件text.sh,然后确保同一个开发组的成员能够进行访问和修改。

创建一个名叫develop的组

将develop_user01、develop_user02添加至同一个附加组中

保证组用户至少有执行的权限,且将需要共享的文件目录添加至附加组中

验证:

2.2.chgrp命令

chgrp设置一个文件属于哪个组,属组

语法:chgrp -R 组名 文件  -R是递归的意思

三、基本权限ACL(Access Control List)

3.1.基本权限ACL的诞生?

试想一下,chmod是否能对一个独立的用户(非组用户)/ 独立组来进行管理?

回顾:chmod 仅支持三类权限对象,语法为 chmod [ugoa][+-=][rwx] 文件,因此它就无法实现:能单独允许用户 bob 读取文件,而其他非组用户无权访问。

结论:在 Linux 中,传统的 chmod 命令无法直接针对独立用户(非所有者、非所属组、非其他用户)设置权限,它只能按 “所有者(u)- 所属组(g)- 其他用户(o)” 三类角色分配权限。若需为特定用户单独设置权限(例如允许用户 alice 读写文件,而其他用户无权限),需通过 ACL——access control list(访问控制列表) 实现。

3.2.基本权限ACL和UGO权限有什么不同?

chmod 无法针对独立用户设置权限,仅支持 u/g/o 三类角色,且只能一个用户,一个组和其他用户。

ACL(setfacl / getfacl)是解决方案,可精细化控制单个用户/组的权限,能设置不同用户,不同的基本权限(r、w、x)。对象数量不同。适用于多用户共享场景。

注意:ACL 权限优先级高于传统权限

总:

特性 chmod ACL
权限对象 所有者、所属组、其他用户 可指定任意用户、组
精细化程度 仅三类角色 支持为每个用户/组单独设置权限
兼容性 所有Linux系统支持 系统文件系统启用ACL(主流默认支持)

set force acl

get force acl

force:强制,迫使

语法:

setfacl  -m  u:xiaowang:rw        /home/test.txt

serfacl:命令

-m:       设置

u:xiaowang:rw        用户或组:用户名:权限           

/home/test.txt:      文件对象

3.2.1.查看文件有哪些acl权限

3.2.2.设置用户bob权限

例1:setfacl -m u:bob:rw /home/text.txt

例2:setfacl -m u:bob:- /home/text.txt

核心选项

选项 功能描述
-m 修改 ACL 规则(添加或更新权限,常用)。
-x 删除指定 ACL 规则(仅删除用户/组的 ACL 权限,保留其他规则)。
-b 清除所有 ACL 规则(保留传统权限 u/g/o)。
-k 删除默认 ACL(仅对目录有效)。
-R 递归应用规则(对目录及其所有子文件/子目录生效)。
-d 设置默认 ACL(仅对目录有效,新创建的文件/子目录会继承此 ACL)。
--set 覆盖原有所有 ACL 规则(需完整指定所有权限,谨慎使用)。

规则需遵循:

类型:对象:权限

其中:

类型:u(用户)、g(组)、m(掩码 mask)、o(其他用户)。
对象:用户名或组名(u:或g:后不指定对象时,对应传统权限中的所有者/所属组)。
权限:r(读,4)、w(写,2)、x(执行,1),或用数字表示(如rw-=6、rwx=7)。

    3.2.3.查看ACL

    例:getfacl /home/test.txt

    3.2.4.删除ACL

    1)删除部分acl权限

    例:setfacl -x g:bob /home/test.txt

    2)删除所有acl权限

    例:setfacl -b /home/test.txt

    3.2.5.场景示例

    1)为特定用户添加权限

    举例:允许用户bob读写project.txt(所有者develop_user01,所属组为develop)

    2)为特定组添加权限

    举例:允许hr组读取并执行/home/develop_user01/shell目录(注意,目录需x权限才能进入,文件需x权限才能执行)

    setfacl -m g:hr:rx /data/scripts  # g:hr:rx 表示组 hr 拥有读和执行权限

    注意:目录需 x 权限才能进入,文件需 x 权限才能执行。

    3)递归设置目录及其子内容的acl

    举例:为/shared目录继器所有子文件/子目录添加用户bob的读写权限

    setfacl -R -m u:bob:rw /shared  # -R 递归应用到子内容

    4)设置默认ACL(新文件自动继承权限)

    举例:在/project目录中,新创建的文件/子目录默认允许组develop读写

    # 为目录设置默认 ACL(仅对目录有效)
    setfacl -d -m g:develop:rw /project

    -d表示“默认ACL”,新文件会继承此规则(但已有文件不会受影响)

    验证:创建新文件后用getfacl查看,会显示:default:group:develop:rw-

    5)删除指定用户/组的ACL权限

    举例:移除用户bob对test.txt的ACL权限。

    setfacl -x u:bob test.txt  # -x 仅删除用户 bob 的规则,其他权限不变

    6)清除所有ACL规则

    举例:删除test.txt的所有ACL权限,恢复传统权限

    setfacl -b test.txt  # -b 清除所有 ACL,保留 u/g/o 的传统权限

    Logo

    AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

    更多推荐