Linux权限深入解读

0x01 Linux权限

Linux权限的概念

Linux下有两种用户:超级用户(root)和普通用户

  • 超级用户:可以在linux系统下做任何事情,不受限制
  • 普通用户:在linux下做有限的事情。
  • 超级用户的命令提示符是"#",普通用户的命令提示符是"$"。

添加普通用户:adduser

从root切换普通用户:su user

从普通用户切换root用户:su root 或 su

删除普通用户(一定要是root用户才可删除): userdel -r userg

0x02 Linux权限管理

文件访问者的分类(人)

对于一个被创建出来的文件,总会有被访问的一天,在Linux下的访问者分为三类:拥有者、所属组、other

1️⃣文件拥有者:

这个文件就是他的,是他所拥有的
2️⃣文件的other:

外界的访问者
3️⃣文件所属组:

这个文件所属组

们的云服务器大部分都是我们自己在用,所以我们既是拥有者也是所属组 , 当我们一某一个身份去访问某一个文件时,每一个文件都会有拥有者和所属组, 会自动匹配是拥有者和所属组,若都不是那么就是other,Linux并不会记录other是谁👨

用户与访问者之间的联系

上面我们讲到了用户 可分为两种:root【超级用户】和普通用户。访问者可分为三种:拥有者、所属组 和 other

对于【root】和【普通用户】它都是一种人呢,**对于【拥有者】【所属组】【other】是属于一种角色,而人呢则是去扮演各种各样的角色。**比方说你在家里是爸爸妈妈的好孩子、在学校是认真学习的好同学、在公司里呢则是刻苦工作的打工人;你现在是一个孩子的角色,等你再大一个就是一个丈夫或者妻子的角色,再过些年呢你就是一个父亲或者母亲的角色。

所以在人生中我们都扮演这各种各样的角色:就像我们是一个普通用户可以是右边的所有角色,但是对于root而言它其实扮演什么角色都是一样的,因为在Linux在若是使用root超级用户去执行一些事情的话可以说是百无禁忌,因为它的权限最高

文件类型和访问权限(事物属性)

Linux系统不是以文件名后缀区分文件类型的,而是通过ll指令显示的第一个字符区分文件类型的!

文件类型
cpp 复制代码
d:目录文件
-:普通文件(文本,源代码,可执行程序,第三方动静态库)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件

实例:

基本权限

Linux系统中,文件的权限属性分为三类:r(读-4)、w(写-2)、x(可执行-1)

  • 读(r): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
  • 写(w): Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
  • 可执行(x): execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
  • **"---"**表示不具有该项权限

前面我们得知第1位是文件类型,后面的9位均为权限属性

  • 普通文件file.txt的拥有者具有rw可读可写权限,没有x可执行权限,所属组具有r可读权限,没有wx可写可执行权限,其它用户具有r可读权限,没有wx可写可指向权限。
文件权限值的表示方法

字符表示方法

|---------|---------|
| Linux表示 | 说明 |
| r-- | 只读 |
| -w- | 只写 |
| --x | 仅可执行 |
| rw- | 可读写 |
| -wx | 可写可执行 |
| r-x | 可读可执行 |
| rwx | 可读可写可执行 |
| --- | 无任何权限 |

8进制数值表示方法

字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,而真可用1表示,假可用0表示,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。如下:

|------|-----|-----|
| 权限符号 | 二进制 | 八进制 |
| r-- | 100 | 4 |
| -w- | 010 | 2 |
| --r | 001 | 1 |
| rw- | 110 | 6 |
| r-x | 101 | 5 |
| -wx | 011 | 3 |
| rwx | 111 | 7 |
| --- | 000 | 0 |

文件访问权限的相关设置方法

chmod

功能: 设置文件的访问权限

格式: chmod 参数 权限 文件名

常用选项:

  • R -> 递归修改目录文件的权限

说明: 只有文件的拥有者和root才可以改变文件的权限

**法一:**用户表示符+/-=权限字符

  • +:向权限范围增加权限代号所表示的权限
  • -:向权限范围取消权限代号所表示的权限
  • =:向权限范围赋予权限代号所表示的权限
  • 用户符号:
  • u:拥有者
  • g:拥有者同组用
  • o:其它用户
  • a:所有用户

示例1:

**减去拥有者的读权限:**chmod u-r file.txt

减去 所属组 其它用户 **的读权限:**chmod g-r,o-r file.txt

**加上拥有者所属组其它人的所有权限:**chmod u+rwx,g+rwx,o+rwx file.txt

**⚠ 注意:**root不受任何权限约束,可以为所欲为,现在,我们把普通用户xzy切换到超级用户root:

此时我file.txt的拥有者和所属组均为普通用户xzy,那么我root即其它用户,按照上述权限设置,root作为其它用户不具备任何读写权限,可实际root不受任何约束:

由此可见,这里的其它用户指的是除root以外的其它普通用户

示例2: 使用三位八进制数字

还使用chmod a= 来进行整体的修改:

修改文件的拥有者

chown

**功能:**修改文件的拥有者

**格式:**chown 参数 用户名 文件名

注意:给别人文件需要争得别人同意

实例:

这里并没有经过别人的同意,直接把文件给了root用户,原因就在于使用了sudo提升权限,相等于是以root的身份运行该程序,才有了强制更改的权限。不过这是针对普通用户修改文件权限需要用到sudo,如果是root用户可以直接更改不用sudo

使用chown可以连续修改拥有者和所属组:

修改文件的所属组

chgrp

**功能:**修改文件或目录的所属组

格式: chgrp 参数 用户组名 文件名

常用选项: -R 递归修改文件或目录的所属组

实例:

以root用户直接更改:

以普通身份更改所属组,需要sudo提高权限:

此时拥有者的权限为root,想要改变所属组的可读权限需要sudo提升权限:

查看或修改文件权限掩码

umask

**功能:**查看或修改文件掩码

新建文件夹默认权限=0666,新建目录默认权限=0777

但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是umask,则实际创建的出来的文件权限是:mask & ~umask。后文会进行详细展开。

这里我们最终创建的目录的权限值为775,最终创建的普通文件的权限值为664

格式: umask 权限值

**说明:**将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。

注意: 凡是在权限掩码中出现的权限都不应该在最终权限出现。实际中我们只关注权限掩码的后三位

实例:

此图很好的解释了为什么先前我们创建的目录权限为775,而普通文件的权限为664。

普通文件的默认权限是从666开始的,目录文件的默认权限是从777开始的,但是最终权限 != 默认权限。原因就在于存在权限掩码umask。这也就导致Linux最终权限 = 默认权限"去掉"umask中存在的权限。换句话说就是凡是在权限掩码中出现的权限都不应在最终权限中出现

umask的值是可以更改的,如下我们更改umask的值为003

最终权限 = 默认权限 & (~umask)

目录的权限
  • r可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
  • w可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
  • x可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
粘滞位

在Linux中,可以存在一些目录,拥有者和所属组是root,其它人允许以other的身份在该目录下进行文件的创建,读取,删除,修改等**(公共信息传递区)**。如下的一个名为tmp的目录

该目录的拥有者和所属组均属于root,且other其它人的权限都是没有限制的,也就是说任何人都可以在里头读写文件。

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由

  • 一、超级管理员root删除
  • 二、该目录的所有者删除
  • 三、该文件的所有者删除
相关推荐
比昨天多敲两行1 小时前
Linux进程间通信-共享内存
linux·运维·服务器
哎呦,帅小伙哦1 小时前
Nanomsg usock 模块:Socket 选项与错误码介绍
linux·中间件·nanomsg
lbb 小魔仙1 小时前
Docker一键部署 EasyNode 面板,随时随地可视化管理服务器
服务器·docker·容器
Elastic 中国社区官方博客1 小时前
Hacknight Beijing:基于阿里云与 Elastic 构建 AI Agents
大数据·运维·人工智能·elasticsearch·搜索引擎·阿里云·云计算
草莓熊Lotso1 小时前
【Linux网络】深入理解 HTTP 协议(一):从基础概念到 URL 编码解码
linux·网络·c++·网络协议·http·软件工程
一号弯1 小时前
用NAVICAT访问非本地服务器的报错问题
运维·服务器
能摆一天是一天2 小时前
windows docker 部署openfire
运维·docker·容器
jingling5552 小时前
Flutter | 从基本跳转到路由守卫
服务器·前端·网络·flutter·前端框架