【Linux】权限问题——拥有者、所属组和其他用户的协调

目录

为什么需要权限?

两种用户身份

文件权限

三组权限的详细含义

chmod

身份(谁)

权限(改什么)

chown

chgrp

unmask的理解

粘滞位


为什么需要权限?

Linux 是多用户操作系统 ,服务器上同时有多个用户操作。权限的作用就是:不让别人乱动你的东西,你也动不了别人的东西

两种用户身份

用户类型 提示符 权限
root(超级用户) # 想做啥做啥,不受限制
普通用户 $ 只能操作自己有权限的文件

切换用户命令

bash 复制代码
su - 用户名      # 切换到目标用户
su -            # 切换到 root(需要root密码)
sudo 命令       # 普通用户临时以root身份执行(需要配置)

文件权限

bash 复制代码
hzx@VM-0-12-ubuntu:~$ ls -l
-rw-rw-r-- 1 hzx hzx 78 Aug 31 18:21 code.c
drwxrwxr-x 2 hzx hzx 4096 Aug 31 18:13 mydir/

-  [rw-]  [rw-]  [r--]

│    │      │      │
│    │      │      └── 其他人(Others)权限
│    │      └── 所属组(Group)权限
│    └── 所有者(User)权限
└── 文件类型


-rw-rw-r-- 1 hzx hzx 78 Aug 31 18:21 code.c
              |   |
              |   |
              |   |
              |   |___(所属用户组)
              |
              |__(文件的拥有者)

注意:后面的名字other不显示

三组权限的详细含义

权限 文件的作用 目录的作用
r(读) 可以看文件内容(如 cat 可以看目录里的文件名(如 ls
w(写) 可以修改文件内容 可以在目录里创建/删除/重命名文件
x(执行) 可以运行程序/脚本 可以cd进入该目录

chmod

作用 :修改文件或目录的访问权限

谁有权限执行

  • 文件的所有者(owner)

  • root 超级用户

身份(谁)

符号 含义
u user(所有者)
g group(所属组)
o others(其他人)
a all(所有人,= u+g+o)

权限(改什么)

符号 含义
r
w
x 执行
bash 复制代码
hzx@VM-0-12-ubuntu:~$ ls -l code.c
-rw-rw-r-- 1 hzx hzx 78 code.c


//给所有者加执行权限
hzx@VM-0-12-ubuntu:~$ chmod u+x code.c
hzx@VM-0-12-ubuntu:~$ ls -l code.c
-rwxrw-r-- 1 hzx hzx 78 code.c
# 所有者多了 x

//去掉所属组的写权限
hzx@VM-0-12-ubuntu:~$ chmod g-w code.c
hzx@VM-0-12-ubuntu:~$ ls -l code.c
-rwxr-r-- 1 hzx hzx 78 code.c
# 组的 w 没了

//给其他人加上读权限(如果之前没有)
hzx@VM-0-12-ubuntu:~$ chmod o+r code.c

//直接设置其他人的权限为只读
hzx@VM-0-12-ubuntu:~$ chmod o=r code.c
# 不管之前是什么,现在 others 只有 r

// 给所有人加执行权限
hzx@VM-0-12-ubuntu:~$ chmod a+x code.c
hzx@VM-0-12-ubuntu:~$ ls -l code.c
-rwxr-xr-x 1 hzx hzx 78 code.c
# 所有人都有了 x

// 去掉所有人的写权限
hzx@VM-0-12-ubuntu:~$ chmod a-w code.c
hzx@VM-0-12-ubuntu:~$ ls -l code.c
-r-xr-xr-x 1 hzx hzx 78 code.c
# 所有 w 都没了

注意点:

只有文件的拥有者(或 root)才能改权限。

bash 复制代码
-rw-r--r-- 1 root root 0 Sep 24 20:07 root.txt
hzx@VM-0-12-ubuntu:~$ chmod u-rw root.txt
chmod: changing permissions of 'root.txt': Operation not permitted

root.txt 的"拥有者"是 root。

hzx 是普通用户,不是 root。

尽管 hzx 能看到这个文件,但他没有权限修改这个文件的权限属性。

系统会无情地拒绝你的任何访问请求。

bash 复制代码
--rw-rw-rw- 1 hzx hzx 10 Sep 24 20:09 my.txt
---r---r--- 1 root root 0 Sep 24 20:07 root.txt
hzx@VM-0-12-ubuntu:~$ cat my.txt#这里cat是需要读权限的,
cat: my.txt: Permission denied

hzx@VM-0-12-ubuntu:~$ echo "hello world" >> my.txt
-bash: my.txt: Permission denied

确定权限信息的时候,顺序固定且只确定一次:拥有者 → 所属组 → other。

流程拆解:

当你执行一条命令(如 cat)时,系统会按以下顺序判断你是谁:

  1. 第一步:我是拥有者吗?

    → 如果是,就应用"拥有者权限"。判断结束,不再往下看。

  2. 第二步:如果第一步不是,那我是所属组的成员吗?

    → 如果是,就应用"组权限"。判断结束,不再往下看。

  3. 第三步:如果前两个都不是

    → 你就是"其他人(other)",应用"其他人权限"。

关键点 :这个判断只进行一次,从 ugo,一旦命中,立即生效。

结论:可执行权限就是"允许你把它当作程序来运行"。

bash 复制代码
# 假设有一个脚本
-rw-rw-r-- 1 hzx hzx 50 script.sh
hzx@VM-0-12-ubuntu:~$ ./script.sh
-bash: ./script.sh: Permission denied   # 没有 x 权限,无法执行

# 加上执行权限
hzx@VM-0-12-ubuntu:~$ chmod +x script.sh
-rwxrwxr-x 1 hzx hzx 50 script.sh
hzx@VM-0-12-ubuntu:~$ ./script.sh
Hello, World!   # 成功执行!

对于目录:
drw-rw-r-- 2 hzx hzx 4096 mydir/   # 没有 x 权限
hzx@VM-0-12-ubuntu:~$ cd mydir/
-bash: cd: mydir/: Permission denied   # 无法进入
  • 文件 :有 x 才能运行 ./file。没有 x,你只能看内容(cat),不能运行。

  • 目录 :有 x 才能 cd 进去。没有 x,即使有 r 你也无法进入目录。

chown

作用 :修改文件或目录的拥有者(owner)所属组(group)

谁有权限执行

  • root 超级用户(只有 root 能改)

  • 普通用户不能把自己的文件转给别人

bash 复制代码
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l
total 8
-rw-rw-r-- 1 hzx hzx  0 Sep  7 10:00 code_hzx.c
-rw-r--r-- 1 root root 0 Sep  7 10:00 code_root.c

只修改拥有者

bash 复制代码
# 把 code_root.c 的拥有者从 root 改为 hzx
hzx@VM-0-12-ubuntu:~$ sudo chown hzx code_root.c
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l code_root.c
-rw-r--r-- 1 hzx root 0 Sep  7 10:00 code_root.c
#           │    │
#           │    └── 所属组还是 root
#           └── 拥有者变成了 hzx

只修改所属组

bash 复制代码
# 把 code_root.c 的所属组从 root 改为 hzx
hzx@VM-0-12-ubuntu:~$ sudo chown :hzx code_root.c
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l code_root.c
-rw-r--r-- 1 hzx hzx 0 Sep  7 10:00 code_root.c
#           │    │
#           │    └── 所属组变成了 hzx
#           └── 拥有者还是 hzx

同时修改拥有者和所属组

bash 复制代码
# 把 code_hzx.c 的拥有者改为 root,所属组改为 root
hzx@VM-0-12-ubuntu:~$ sudo chown root:root code_hzx.c
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l code_hzx.c
-rw-rw-r-- 1 root root 0 Sep  7 10:00 code_hzx.c
#           │    │
#           │    └── 所属组变成了 root
#           └── 拥有者变成了 root

把拥有者改回 hzx,所属组不改

bash 复制代码
hzx@VM-0-12-ubuntu:~$ sudo chown hzx code_hzx.c
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l code_hzx.c
-rw-rw-r-- 1 hzx root 0 Sep  7 10:00 code_hzx.c
#           │    │
#           │    └── 所属组还是 root
#           └── 拥有者回到了 hzx

chgrp

作用 :修改文件或目录的所属组(group)

谁有权限执行

  • root 超级用户

  • 文件的拥有者(但必须同时是该组的成员)

  • 普通用户不能把文件组改成自己不属于的组

当前情况

bash 复制代码
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l
total 8
-rw-rw-r-- 1 hzx hzx  0 Sep  7 10:00 code_hzx.c
-rw-r--r-- 1 root root 0 Sep  7 10:00 code_root.c
#           │    │
#           │    └── 所属组
#           └── 拥有者

修改文件的所属组

bash 复制代码
# 把 code_hzx.c 的所属组从 hzx 改为 root
hzx@VM-0-12-ubuntu:~$ sudo chgrp root code_hzx.c
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l code_hzx.c
-rw-rw-r-- 1 hzx root 0 Sep  7 10:00 code_hzx.c
#           │    │
#           │    └── 所属组变成了 root
#           └── 拥有者还是 hzx

把所属组改回 hzx

bash 复制代码
hzx@VM-0-12-ubuntu:~$ sudo chgrp hzx code_hzx.c
hzx@VM-0-12-ubuntu:~/notes/lesson_Permission$ ls -l code_hzx.c
-rw-rw-r-- 1 hzx hzx 0 Sep  7 10:00 code_hzx.c

unmask的理解

决定了新建文件和目录的默认权限
最终权限:mask & ~umask

基础值

  • 普通文件 = 666(二进制:110 110 110)

  • 目录 = 777(二进制:111 111 111)

umask(可能不同)

  • 002 = 二进制 000 000 010
bash 复制代码
普通文件基础权限:  6  6  6
          umask:  0  0  2
                  ─────────
  最终权限:        6  6  4  →  664
bash 复制代码
目录基础权限:      7  7  7
          umask:  0  0  2
                  ─────────
  最终权限:        7  7  5  →  775

粘滞位

你和你朋友一起写文件,如果朋友有写权限意味着朋友可以把你创的文件删了,这样很不合理因此就有了粘滞位。

粘滞位(Sticky Bit) 是 Linux 中一种特殊权限,主要用于保护共享目录下的文件

语法:chmod+t 目录名

没有粘滞位时(危险)

bash 复制代码
# hzx 创建自己的文件
hzx@VM-0-12-ubuntu:~$ echo "hzx" > /home/shared/hzx.txt

# myfriend 居然能删掉 hzx 的文件!
myfriend@VM-0-12-ubuntu:~$ rm /home/shared/hzx.txt
# 删除成功  这不合理!

加上粘滞位后(安全)

bash 复制代码
# root 给共享目录加上粘滞位
root@VM-0-12-ubuntu:~# chmod +t /home/shared

# hzx 再创建文件
hzx@VM-0-12-ubuntu:~$ echo "hzx" > /home/shared/hzx.txt

# myfriend 想删 hzx 的文件
myfriend@VM-0-12-ubuntu:~$ rm /home/shared/hzx.txt
rm: cannot remove '/home/shared/hzx.txt': Operation not permitted
# 删除失败  被阻止了!
相关推荐
平行云1 小时前
实时云渲染信创架构解析:从GPU池化到全栈适配的技术演进
linux·unity·docker·ue5·webgl·数字孪生·实时云渲染
handler011 小时前
【Linux】信号:内核的“敲门声”
linux·运维·服务器·c++·c·信号·signal
T1mzhou1 小时前
ARM64 Linux 6.10内核启动流程6-psci.c和ATF/U-Boot 的电源接口
linux·服务器·c语言
lucybean012 小时前
食品加工行业污水处理曝气装置采购避坑与合规筛选指南
运维
harmony&2 小时前
DevOps进阶:SonarQube 代码审计与 Harbor 镜像仓库实战
运维·devops
Neighbor_OldY2 小时前
CSRF跨站请求伪造攻击检测与应急处置实战:伪造请求识别与防护落地
运维·安全·web安全
生活爱好者!2 小时前
NAS能批量做短视频?docker部署MoneyPrinterTurbo
运维·docker·容器
ch3nyuyu2 小时前
驱动第三阶段
linux
考虑考虑2 小时前
Redis8.8新特性
运维·redis·后端