目录
为什么需要权限?
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)时,系统会按以下顺序判断你是谁:
-
第一步:我是拥有者吗?
→ 如果是,就应用"拥有者权限"。判断结束,不再往下看。
-
第二步:如果第一步不是,那我是所属组的成员吗?
→ 如果是,就应用"组权限"。判断结束,不再往下看。
-
第三步:如果前两个都不是
→ 你就是"其他人(other)",应用"其他人权限"。
关键点 :这个判断只进行一次,从 u → g → o,一旦命中,立即生效。
结论:可执行权限就是"允许你把它当作程序来运行"。
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
# 删除失败 被阻止了!