【Linux操作系统】简学深悟启示录:Linux权限
Linux 权限是系统通过对文件 / 目录设置读(r)、写(w)、执行(x)权限,分别管控文件所有者、所属组及其他用户对其的访问操作,以保障系统安全
shell的运行原理
对于 Linux 来说,我们输入的命令行本质上就是在输入字符串,指令的本质就是调用在特定路径下存放的可执行文件,所有的指令最终都要在 OS(操作系统)内执行,但是 OS 的使用难度比较高,用户一般很难直接使用 OS 和他打交道,所以在用户输入的指令和 OS 之间设置了一层命令行解释器
命令行解释器会将命令翻译给核心(kernel)处理,同时将翻译后的结果给到使用者
存在的意义:
- 进行命令行解释
- 保护
OS,对于用户的非法请求直接拦截,起到过滤器的效果
用户的分类
用户一般分为:
root:超级用户- 普通用户:我们新建的用户,即
adduser
由于某些情况下,比如下载依赖的时候就需要切换到 root 账号才能下载,可以使用 su 指令进行切换
超级用户的命令提示符是 #,普通用户的命令提示符是 $
用户的切换
- root用户切换普通用户
1 | [root@hcss-ecs-6aa4 ~]# su zzh_test |
su user 表示切换到普通用户,也可以使用exit 或 ctrl+d 退出 root 账号,普通用户切换普通用户同理
- 普通用户切换root用户
1 | [zzh_test@hcss-ecs-6aa4 ~]$ su - |
或
1 | [zzh_test@hcss-ecs-6aa4 ~]$ su |
su 后面不加 user 默认表示切换到 root 用户,su - 也是切换到 root 用户,但是会显示登录时的时间、IP 等信息
关键差异对比
| 特性 | su(无 -) |
su -(带 -) |
|---|---|---|
| 环境变量 | 保留当前用户的环境变量 | 加载目标用户的环境变量 |
| 工作目录 | 保持当前目录 | 切换到目标用户的主目录 |
| 用户体验 | 部分命令可能因环境变量不匹配而无法正常工作(如找不到命令) | 完全进入目标用户的环境,命令路径正常 |
| 使用场景 | 临时执行特定命令,无需完整环境 | 需要以目标用户身份进行完整操作 |
例如,若要以root身份执行单个命令,可直接用 su -c "command" root;若要完整登录root环境,则用 su -
🔥值得注意的是:
1 | [zzh_test@hcss-ecs-6aa4 ~]$ sudo whoami |
我们如果想要对特定指令进行 root 身份运行又不想登录那么麻烦的话,可以用 sudo 进行提权,那么以后就可以使用 sudo command 的方式在 root 身份下快速执行命令
但是这种使用方式就会有疑问,因为输入的是普通账户的密码就能使用 root 的权限,那么这样岂不是显得 su 很没用,人人都可以用 root 了?
其实不是这样的,目前我们用 adduser 新建的用户,没有办法执行 sudo,系统不信任你,除非你添加到系统信任的白名单里才能执行以上操作
关于这部分知识到了后面会做介绍
权限的访问属性
一件事是否允许被执行,取决于权限的属性,相当于一个人的身份
1 | -rwxrw-r-- 1 zzh_test zzh_test 44 Jun 29 20:41 text1 |
看一个例子,该代码展示的是一个文件的详细信息
r表示可读w表示可写x表示可执行-对应权限位置,表示没有权限
对于文件和目录来说,rwx 的意思稍微有些区别:
r对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限w对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限x对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
但是这么一长串表示什么意思呢?
在 Linux 里分为三种身份:拥有者,所属组,其他人(即除了拥有者,所属组以外的)
举个例子讲解下所属组的具体作用:
假设有甲和乙分别在同一家公司的
A和B组,他们虽然在不同组但是负责同一项目,由于公司竞争机制,所以他们并不想所做的成果被互相看到,比如甲刚做好一个部分不想给乙看到,那么他可以直接设置该文件的其他人权限为---,但是这就无法给老板看成果了,因此就需要所属组,可以理解为白名单,把老板拉到这个所属组里,让老板有权限进行操作
回到这个例子上:
1 | -rwxrw-r-- 1 zzh_test zzh_test 44 Jun 29 20:41 text1 |
- 第一位表示文件类型,之前讲过,
-表示文件,d表示文件夹 2-4位表示拥有者的权限,对于该例子表示拥有者可读可写可执行5-7位表示所属组的权限,对于该例子表示所属组成员可读可写8-10位表示其他人的权限,对于该例子表示其他人可读
再往后看,第一个 zzh_test 表示文件所属用户,第二个 zzh_test 表示文件所属用户组
🔥值得注意的是:
Linux系统中,文件名都是我们自己取的,例如test.c,加上.c是为了方便我们知道这是个C语言文件,对于Linux系统来说这个文件名后缀没有直接意义,系统识别类型主要还是通过第一位的符号- 创建用户时会默认创建一个同名的基本组,用户所属组的名字和用户名相同,默认情况下该用户会被包含在这个所属组中,即
zzh_test用户默认是包含在zzh_test所属组的
权限的修改
chmod
1 | [zzh_test@hcss-ecs-6aa4 ~]$ ll text1 |
chmod 用于设置文件的访问权限,只有文件的拥有者和 root 才可以改变文件的权限,-R 递归修改目录文件的权限
+:向权限范围增加权限代号所表示的权限-:向权限范围取消权限代号所表示的权限=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者g:拥有者同组用o:其它用户a:所有用户
🔥值得注意的是:
也可以通过 chmod 000 text1 的方式来修改权限,即将所有角色的权限取消,但一般修改不同角色的权限时用八进制,比如 chmod 420 text1
chown
1 | [root@hcss-ecs-6aa4 zzh_test]# ll text1 |
chown 用于修改文件的拥有者,此命令只能由 root 使用,-R 递归修改文件或目录的所有者
chgrp
1 | [zzh_test@hcss-ecs-6aa4 ~]$ charge other_group text1 |
修改文件或目录的所属组,-R 递归修改文件或目录的所属组
假设你是用户 zzh_test,属于 zzh_group 和 dev_group 两个组,你有一个自己的文件 text1(所有者是 zzh_test)。你可以把 text1 的所属组改成 zzh_group 或 dev_group(因为你是这两个组的成员),但不能改成 root 组或 other_group(如果你不在这些组里),会提示权限不足
常见问题
umask掩码的作用?
系统会为新文件默认分配权限(通常文件是 666,目录是 777),而 umask 会 “屏蔽” 掉其中某些权限,最终权限 = 默认权限 - umask 权限
其实实际权限的计算是通过位运算实现的,但是为了计算简便直接相减也是可以的
例如:若 umask 为 022,则新文件权限为 666 - 022 = 644(即 -rw-r--r--),新目录权限为 777 - 022 = 755(即 drwxr-xr-x)
默认情况下,系统创建文件和目录的权限可能过于宽松(如文件
666、目录777),这会导致所有用户都能读写甚至执行文件,存在安全风险。通过umask屏蔽不必要的权限,确保文件和目录仅拥有完成任务所需的最低权限。例如,日志文件通常只需所有者可写,其他用户只读(644),此时umask可设为022每次创建文件时手动指定权限(如
chmod)繁琐且易出错,umask提供了自动化的默认权限设置机制。团队协作规范:团队环境中,统一的umask配置可确保所有成员创建的文件权限一致,避免因权限混乱导致的协作问题
如何防止文件被删除?
1 | [root@localhost ~]# chmod +t /home/ # 加上粘滞位 |
我们知道对于一个目录来说,other 只要具有 w 权限就可以对文件进行修改删除,但是常常我们只希望别人写入,而不是删除,为了实现只可写的权限,可以使用粘滞位 chmod +t,即 x 的位置被替换成 t
此时该目录下的文件只能由
root删除- 该目录的所有者删除
- 该文件的所有者删除
🔥值得注意的是: 一个文件能否被删除,并不由文件本身决定的,是由文件所处的目录权限决定的。因此粘滞位是给目录设置的,目录设置了粘滞位,文件除了上述所说的角色,其他人就无法删除了
目录权限的区分
目录的可执行权限是表示你可否在目录下执行命令:
- 如果目录没有
-x权限,则无法对目录执行任何命令,甚至无法cd进入目,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件) - 如果目录具有
-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档(可以执行和可以实现是两码事)

















