128 64 32 16 8 4 2 1128 64 32 16 8 4 2 11 0
128 64 32 16 8 4 2 11 0 1
128 64 32 16 8 4 2 11 0 0 1
2048 1024 512 256 128 64 32 16 8 4 2 11 0 1 1 0 1 0 1 1 1 0
128 64 32 16 8 4 2 11 0
128 64 32 16 8 4 2 11 0 1
128 64 32 16 8 4 2 11 0 1 1






上图中 1 是文件类型具体如下
s 套接字
b 块
c 字符
d 文件夹
l 软连接
- 普通文件
上图中 5 是文件归属人,2 是归属人拥有的权限。
上图中 6 是文件归属组,3 是归属组拥有的权限。
上图中 4 是除了 5 和 6 以外的其他人权限。
他们分别由 r(读)、w(写)、x(执行)三类基础权限构成,每类权限对应固定数字权值:r=4、w=2、x=1。通过权值相加,可快速组合出不同的权限配置(如 rwx=7、rw-=6、r--=4)。
r(读)、w(写)、x(执行)对应操作命令如下所示

3.2、为什么用 4、2、1 来代表执行写入和读取呢?
这里有几个重要的原因:
取 4、2、1 任何两个数的加和得到的值,都不与 4、2、1 这几个数重合(确保值唯一性来源)
高位恒定为 1 的设计(4→100、2→10、1→1),正是位运算掩码的典型特征,方便二进制,按位与(&)、按位或(|)、按位非(~)、按位异或(^) 运算(用于权限判存、追加和删除)
2⁰=1、2¹=2、2²=4 方便日后扩充
例如:
chmod 500 file1.logchmod 600 file2.logchmod 700 file3.log
权限 5 一定是由 1 和 4 得来的(文件归属人拥有读和执行权限)
权限 6 一定是由 2 和 4 得来的(文件归属人拥有读和写权限)
权限 7 一定是由 1、2 和 4 得来的(文件归属人拥有读、写和执行权限)
这样单凭一个数值就可以判断,权限是由哪几种组合的
既如此,系统又是怎么知道这个数值,具体包含了 4、2、1 当中哪几个呢?
具体示例:修改 file1.log 权限,仅归属人有读和执行权限
chmod 500 file1.log3.2.1、当对文件 file1.log 写入操作时候
echo testing >> file1.log系统会判断当前用户权限是否包含写入
判断方式是进行二进制按位与(&)运算
得出 0(不包含)或 非 0 (包含)的结论
file1.log 归属人权限为 5 二进制为 101写入时候 echo testing >> file1.log 需要权限为 2 二进制为 105 和 2 做按位与运算,如下所示按位与:对位都为 1 返回 1 否则返回 0101 # 5 的二进制010 # 2 的二进制 (左侧补0凑齐3位)000 # 按位与 结果为 0


3.2.2、当对文件 file1.log 读取操作时候
cat file1.log系统会判断当前用户权限是否包含读取
判断方式是进行二进制按位与(&)运算
得出 0(不包含)或 非 0 (包含)的结论
file1.log 归属人权限为 5 二进制为 101读取内容时候 cat file1.log 需要权限为 4 二进制为 1005 和 4 做按位与运算,如下所示按位与:对位都为 1 返回 1 否则返回 0101 # 5 的二进制100 # 4 的二进制100 # 按位与 结果为 二进制 100 十进制 4(非0)


3.2.3、当执行 file1.log 文件时候
./file1.log系统会判断当前用户权限是否包含执行
判断方式是进行二进制按位与(&)运算
得出 0(不包含)或 非 0(包含)的结论
file1.log 归属人权限为 5 二进制为 101执行文件 ./file1.log 需要权限为 1 二进制为 15 和 1 做按位与运算,如下所示按位与:对位都为 1 返回 1 否则返回 0101 # 5 的二进制001 # 1 的二进制 (左侧补0凑齐3位)001 # 按位与 结果为 二进制 1 十进制 1(非0)


3.2.4、怎样向 4、2、1 追加权限

chmod u+w file1.log
file1.log 归属人权限为 5 二进制为 101追加写入权限 十进制为 2 二进制为 105 和 2 做按位或运算,如下所示按位或:对位存在 1 返回 1 否则返回 0101 # 5 的二进制010 # 2 的二进制 (左侧补0凑齐3位)111 # 按位或 结果为 十进制 7 二进制 111

3.2.5、怎样删除 4、2、1 当中某些权限

chmod u-x file1.log按位与:对位都为 1 返回 1 否则返回 0按位非:二进制位逐位变化 0 变 1,1 变 0file1.log 归属人权限为 7 二进制为 111去掉执行权限 十进制为 1 二进制为 001(左侧补0凑齐3位)第一步、先对被去掉的权限进行取反操作(按位非~)二进制 001 取反后为 110第二步、取反后的结果和文件本身权限进行按位与(&)操作111 和 110 做按位与运算,如下所示111 # 7 的二进制110 # 1 按位取反后的二进制110 # 按位与 结果为 十进制 6 二进制 110


按位与:对位都为 1 返回 1 否则返回 0按位非:二进制位逐位变化 0 变 1,1 变 0file1.log 归属人权限为 6 二进制为 110去掉写权限 十进制为 2 二进制为 010(左侧补0凑齐3位)第一步、先对被去掉的权限进行取反操作(按位非~)二进制 010 取反后为 101第二步、取反后的结果和文件本身权限进行按位与(&)操作101 和 110 做按位与运算,如下所示110 # 6 的二进制101 # 2 按位取反后的二进制100 # 按位与 结果为 十进制 4 二进制 100

Linux官方文档地址
https://www.kernel.org/doc/html/latest/
3.2.6、上面 4、2、1 权限表示方式可以用在业务开发当中吗?
假设要做一个博客系统,里面文章有点赞、评论和分享功能
对应权限设置如下:
点赞:1评论:2分享:4
文章权限追加与修改代码如下
<?php// 点赞CONST PRAISE = 1;// 评论CONST COMMENT = 2;// 分享CONST SHARE = 4;$article = 5;if($article & PRAISE) echo "该文章有 点赞 功能 \n";if($article & COMMENT) echo "该文章有 评论 功能 \n";if($article & SHARE) echo "该文章有 分享 功能 \n";// 追加 评论 功能$article = $article | COMMENT;if($article & COMMENT) echo "该文章追加 评论 功能成功 \n";// 删除 点赞 功能$article = $article & (~PRAISE);if(!($article & PRAISE)) echo "该文章删除 点赞 功能成功 \n";输出结果如下:该文章有 点赞 功能该文章有 分享 功能该文章追加 评论 功能成功该文章删除 点赞 功能成功
ACL(Access Control List,访问控制列表)是 Linux/Unix 系统中精细化文件权限管理机制,核心作用是突破传统 rwx(所有者 / 所属组 / 其他人)三段式权限的限制,支持对单个用户、多个用户组单独分配差异化权限,解决传统权限无法满足的复杂授权场景(如 “让用户 A 只读、用户 B 读写、用户组 C 仅执行”)。
ACL 权限的核心价值:弥补传统权限的不足
传统 Linux 权限(如 755、400)仅能控制三类主体的权限:
wangwu 访问你的文件,但不想把他加入你的归属组)。这个时候正是ACL适用场景。

对testdir文件夹及子文件夹添加acl权限使user1用户有读写执行权限setfacl -m u:user1:rwx -R testdir对testdir文件夹及子文件夹添加acl权限使group1组有读写执行权限setfacl -m g:group1:rwx -R testdir对testdir文件夹添加acl权限使user1用户有读写执行权限并且新创建子文件夹也继承父文件夹ACL权限setfacl -m d:u:user1:rwx -R testdir对testdir文件夹添加acl权限使group1组有读写执行权限并且新创建子文件夹也继承父文件夹ACL权限setfacl -m d:g:group1:rwx -R testdir删除testdir文件夹所有ACL权限setfacl -R -b testdir删除指定用户 ACLsetfacl -R -x u:user1 testdir删除指定组 ACLsetfacl -R -x g:group1 testdir删除默认ACLsetfacl -R -k testdir获取文件或文件夹ACL权限getfacl testdir

[lisi@VM-16-3-opencloudos zhangsan]$ ll acl_test/ls: cannot open directory 'acl_test/': Permission denied[lisi@VM-16-3-opencloudos zhangsan]$ cd acl_test/-bash: cd: acl_test/: Permission denied








将权限赋给角色,将用户赋给角色,用户就可以使用角色里权限将权限赋给组,将用户添加到组里,用户就拥有了组里权限
[lisi@VM-16-3-opencloudos acl_test]$ ll /usr/bin/passwd-rwsr-xr-x 1 root root 31984 Jan 8 2024 /usr/bin/passwd


SBIT (粘滞位)核心作用是限制公共目录中文件的删除权限——仅文件归属人或 root 用户可删除 / 移动文件,其他用户即使对目录有写权限,也无法删除他人文件。



#设置SBIT权限chmod 1777 sbit
#查看文件attr属性lsattr file
#锁定文件chattr +i file

#解除锁定chattr -i file
