Linux 权限的概念及shell命令运行原理
Linux权限的概念
Linux下一切皆文件 , 对于每个文件 , 就划分为了三种属性 :
- 1. 可读(r)
- 2. 可写(w)
- 3.可执行(x)
Linux用户的概念
Linux下有两种用户 : 超级用户 , 普通用户
超级用户root : 不受权限约束 ,可以在linux系统下做任何事情,不受限制 , 但是只能有一个
普通用户 : 在linux下做有限的事情 , 可以创建多个普通用户
超级用户的命令提示符是“#”,普通用户的命令提示符是"$"
超级用户和普通用户账号的切换:
直接 su 也可以:
超级用户与普通用户切换:通过 su 用户名 命令实现,如从root(超级用户,命令提示符为 # )切换到普通用户cxj,提示符变为 $ ;从普通用户切换回root时需要输入root密码。直接输入 su 也可切换到root。root用户拥有系统的最高权限,可执行所有操作;普通用户权限受限,通过切换可在不同权限级别下完成任务,保障系统安全。
普通用户多账号之间的切换:
在Linux系统中,多个普通用户账号之间切换,需要输入对方账号的密码,使用的命令格式为 su 目标普通用户名 。例如,有普通用户 user1 和 user2 ,当前在 user1 账号下,执行 su user2 ,然后输入 user2 的密码,即可切换到 user2 账号。
第二种方法就是可以通过 root 间接切换为其他的普通用户 不需要密码
su 和 su - 的区别:
在 Linux 系统中, su 和 su - 是有区别的,主要体现在环境变量和用户家目录的切换上:
命令 作用 环境变量 家目录 su cxj 切换到 cxj 用户,但保留当前用户(如 root)的环境变量 继承原用户(如 root)的环境变量 仍在原用户(如 root)的家目录( /root ) su - cxj 切换到 cxj 用户,同时完全加载 cxj 用户的环境变量 加载 cxj 用户的环境变量 切换到 cxj 的家目录( /home/cxj ) 简单来说, su - cxj 是“彻底切换”用户环境,而 su cxj 是“仅切换用户身份,保留原环境”。通常建议用 su - 用户名 来确保切换到完整的用户环境~
提权指令 : sudo指令
在Linux系统中, sudo 指令是“superuser do”的缩写,用于让普通用户以超级用户(root)或其他指定用户的身份执行命令,无需切换到root账号,能更精细地控制权限。提高普通用户账号的权限
利用 sudo 指令对普通账号进行短暂提权的命令 , 当然也可以切换为 root 账号
普通账号默认执行不了 sudo 指令 ! 这是因为 Linux 系统的权限设计机制 导致的。在 Linux 中, sudo 命令的权限是通过 /etc/sudoers 文件来控制的——只有被明确列入这个文件(可以理解为白名单)的用户,才能使用 sudo 临时获取 root 权限。普通用户(如 cxj )默认不在 sudoers 文件的授权列表里,所以执行 sudo 时会被拒绝,提示“用户不在 sudoers 文件中”。这种设计是为了保障系统安全,避免普通用户随意执行高权限操作(如修改系统配置、删除关键文件等),只有管理员明确授权的用户才能通过 sudo 执行敏感操作~
Linux角色概念
权限依附于角色!
角色 :
1. 拥有者角色 (user)
2. 所属组角色 (group)
3. other角色 (other)
以 test.txt 文件为例,其权限信息是 drwxr-xr-x 2 root root 4096 Oct 2 16:52 test.txt ,这里第一个 root 是拥有者角色,第二个 root 是所属组角色,表示该文件的所属组是 root 组。
再看 hello.txt 文件,权限信息是 -rw-rw-r-- 1 cxj cxj 0 Oct 2 16:08 hello.txt ,第一个 cxj 是拥有者,第二个 cxj 是所属组,即该文件的所属组是 cxj 组。
Linux 没有专门显示 other 角色的属性 , 不是拥有者和所属组角色 , 那就是 other 角色
所属组是什么? 为什么要有所属组?
对权限进行组级别的管理 , 所属组的作用是对权限进行组级别的管理:比如一个组内的多个用户,可通过所属组权限来共享或协作访问文件。不属于文件拥有者、也不属于所属组的用户,就属于 other 角色,其权限由文件的 other 权限段来控制。
可以理解为group存在的意义是保证项目安全的前提,方便组内协作
Linux文件权限属性概念
- r(只读)
- w(只写)
- x(可执行)
在文件的权限那一个区域中,一个有9个字符,该9个字符三三一组,第一组对应的是user,第二组对应得是group,第三组对应的是other
修改文件权限操作
权限 = 人 + 属性
改变权限 , 要么改变人 , 要么改变权限
修改权限 : chmod指令
用于修改文件权限
权限修改规则说明
- 角色标识: u 代表文件拥有者, g 代表所属组, o 代表其他用户(other), a 代表所有角色(u+g+o)。
- 权限操作: + 表示添加权限, - 表示移除权限, = 表示设置限; r(读)、w (写)、x (执行)是三种基本权限。
上图展示了移除权限
上图展示了添加权限
连续改变权限时 , 还可以通过 a+ a- 来进行批量化处理
注意:超级用户不受权限限制,当root用户既不是文件的拥有者也不是所属组,是other时,即使other只有读权限,它也可以随便进行读写执行操作
修改权限还有一种方法:
修改权限—八进制法
因为我们的权限顺序是不变的,都是rwx这样的顺序,并且权限是两种状态,要么拥有要么不拥有,那么就可以这样表示:
111 —表示rwx都拥有
110 —表示rw拥有,x不拥有
000 —表示rwx都不拥有
三位二进制数可以表示为八进制
假设一个文件的权限是:rwx rw- ---,它们分别用二进制表示为:111 110 000
111 110 000 分别用八进制可以表示为7 6 0
那么就有了这样的一种改权限的方法
chmod 111 file.txt
相当于 001 001 001 ;也相当于–x--x–x
这两种方法任选其一
修改拥有者和所属组
chown指令
在Linux系统中, chown 命令用于修改文件或目录的拥有者(user)和所属组(group)。
如果想把一个文件的拥有者给别人:
我们把 hello.txt 的拥有者给root,发现此操作不被允许,在现实生活中,我们给别人一个东西是不是需要得到别人的允许呢?故我们需要:
sudo chown root hello.txt
sudo是权限提升,执行chown命令时,我们以root用户进行执行
如果想把一个文件的所属组给别人 , 就要用到另一个指令---chgrp,但是这个指令仅能修改所属组。
chgrp root hello.txt
同样的道理上述操作这样也是不允许的
sudo chgrp root hello.txt
我们也可以通过下面的方式将拥有者和所属组改回来:
sudo chown cxj:cxj hello.txt
用户访问文件的时候,确定自己相对于文件的身份角色,只会验证一次!!换句话说:权限只会验证一次!!!
三个重要问题:
问题1. 目录权限问题 : 如果进入一个目录需要哪些权限?
r : 我们用户是否有权利查看指定目录下的文件属性 , 访问目录权限和该目录下的文件权限是两回事
w : 决定了特权用户是否有权利在该目录下 , 能否新增,删除,和修改文件名
所以 , 能否进入一个目录需要的权限与 r 和 w 无关 , 与 x 权限有关
可以看出当我们移除 u-x 后 , 想 cd 进入 lesson7 这个文件中 , 是进不去的!
问题2. 为什么我们新建的目录和普通文件的权限是我们所看到的样子?
对于普通文件,默认权限是从 : 666开始 , 称为起始权限
对于目录文件,默认权限是从 : 777开始 , 也称为起始权限
下图是我们新建的目录和文件 : 我们可以观察到 dir 目录是 775 , 另外两个文件的权限是 664 , 为什么和我们前面提到的两个起始权限不一样呢? 这就涉及到下一个知识---权限掩码了
Linux权限掩码
Linux系统中 , 为了对权限进行细粒度控制 , 就出现了---Linux权限掩码
凡是从权限掩码中出现的权限 , 最终都应该从起始权限中去掉
最终权限 = 起始权限 "去掉" uamsk中的权限
去掉, 不能理解为减法 , 实质是位操作 即最终权限 = 起始权限 & (~umask)
当然也可以通过修改 uamsk 后的权限掩码对目录和文件中的权限进行修改
问题3 : --- , 可以删除吗? 粘滞位问题
指定目录下 , 一个其他人新建的文件(即便是root) , 不让读写,但是我们普通用户可以删掉该文件 ! 在谁的目录下谁就有删除的权利!
如果我们今天想让多用户之间 , 共享文件 , 可以吗?
可以通过 root 系统级别的路径下进行共享 , 但是一定不会在任意用户的家目录下共享!
粘滞位
在多用户的Linux系统中,存在“公共共享目录”(比如 /tmp ,所有用户都能在里面创建文件)。如果没有粘滞位:
- 用户A在共享目录里创建了文件 fileA ;
- 用户B对该共享目录有写权限( w ),就可以直接删除 fileA ——这会导致“用户A的文件被其他用户随意删除”,破坏数据安全。
粘滞位就是为了解决这个问题而设计的:它能限制“文件删除权限”,确保“只有特定角色才能删除文件”。
- 没有粘滞位时,最后一位是普通权限(如 x 或 - );
- 设置粘滞位后,最后一位会变成 t (如果其他用户原本有执行权限 x )或 T (如果其他用户原本没有执行权限 - )。
当目录设置粘滞位后,只有三类角色能删除该目录下的文件:
- 1. 超级管理员(root):系统最高权限用户,能删除任何文件。
- 2. 该目录的所有者:比如目录 /tmp 的所有者是 root ,所以 root 能删除 /tmp 下的所有文件。
- 3. 文件的所有者:比如用户A创建了文件 fileA ,只有用户A自己能删除 fileA ;其他用户(即使对目录有写权限)也无法删除。
shell命令以及运行原理
什么是shell外壳?
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
- 对比windows GUI,我们操作windows不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
- shell对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
shell外壳的作用?
1. 交互作用
- 指令解析与传递:Shell 能将用户输入的命令(如 cp 复制文件、 grep 查找内容等)解析成内核可识别的系统调用,传递给 Linux 内核执行。
- 结果格式化呈现:内核执行指令后返回的原始数据,由 Shell 进行格式化、整理,以人类易读的形式展示给用户。
2. 保护作用
- 权限校验:在用户执行指令前,Shell 会检查用户是否具备对应权限。若用户试图执行超出自身权限的操作(如普通用户修改系统核心配置文件),Shell 会拦截并提示权限不足,防止用户误操作破坏系统。
- 隔离用户与内核:用户不直接操作内核,所有交互都通过 Shell 中转,避免用户因操作失误(如错误的系统调用)直接导致内核崩溃,保障了系统的稳定性和安全性。
bash 与 shell 的关系
- Shell 是一类程序的统称:它是用户与 Linux 内核之间的命令解释器,负责解析用户命令并与内核交互。
- bash 是 Shell 的一种具体实现:全称“Bourne-Again SHell”,是目前 Linux 系统中最常用的 Shell 之一(比如 CentOS、Ubuntu 等系统默认使用 bash)。
简单来说,Shell 是“概念/类别”,bash 是“具体的 Shell 程序”,就像“动物”和“猫”的关系——bash 属于 Shell 家族的一员,具备 Shell 的所有核心功能(命令解析、与内核交互等),同时还拓展了很多实用特性(如命令历史、管道、脚本编程等)。
总结:
本文介绍了Linux系统中的权限管理和用户切换机制。主要内容包括:1) Linux文件权限分为可读、可写、可执行三种属性;2) 用户类型分为超级用户(root)和普通用户,通过su命令可切换用户身份;3) 权限与角色(拥有者、所属组、其他用户)相关联;4) 使用chmod、chown等命令修改权限和所有者;5) 目录权限和粘滞位的特殊作用;6) shell作为用户与内核交互的中介,提供指令解析和安全保护功能。文章详细说明了Linux权限系统的设计原理和操作方法,帮助理解多用户环境下的权限控制机制。