【Linux】权限

【Linux】权限

目录

前言

一、权限的概念

二、sudo 提权

三、文件属性和访问权限

四、chmod 指令

五、chgrp 和 chown 指令

六、目录权限

七、缺省权限

八、粘滞位

总结



前言

        本文主要了解Linux中的文件权限,包括认识什么是权限,认识文件属性和文件权限,学习指令 sudo、chmod、chgrp、chown等,还有认识目录权限,缺省权限以及粘滞位。相信读完后,能让你对Linux的权限有一个基本的认识和使用。


一、权限的概念

1.什么是权限

在现实生活中,可以通过常识确定:权限是限制人的。人=真实的人+身份角色,也就是权限会给不同身份的人不同限制。目标事物的属性也会影响权限。比如你不能在短视频软件上写代码,也不能在写代码软件上看短视频。总之,权限 = 人+事物属性。最终影响你能还是不能做一件事。

2.认识人——用户

Linux下有两种用户:超级用户(root)、普通用户。超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。

3.su指令:切换用户

1.root用户下:su [普通用户] 可以直接切换,无需密码

2.普通用户下:直接使用 su 或者使用 su -,然后输入root账户密码即可切换
su:只切换身份,不改变路径su -:重新登录root账户,进入root家目录,并且显示上次登录时间

3.普通用户之间的切换:su [用户名],然后需要输入对方账户密码(所在路径不会切换)

快捷键:Ctrl + D

快速切换成上一个用户,本质是exit指令


二、sudo 提权

如果我们想以普通用户的身份去执行更高权限的命令,就需要使用sudo

sudo就是提权,获取更高权限,一般放在指令最前面使用。比如我们以普通用户创建一个文件:再使用 sudo 提权创建一个文件:可以明显看到文件属性中用户名称的变化,所以 sudo 提权本质就是以root身份去执行命令。但这里有一个疑问?我们使用sudo提权后,系统要求我们输入当前用户的密码,而不是root账户的密码,这是为什么呢?

配置文件——sudoers

其实如果是新创建的用户,是无法使用sudo提权的,如:系统提示无法执行命令,并提到了一个文件——sudoers,其实这就是一个配置文件该文件只能使用 root 账号才能打开,其实这文件就相当于一个白名单,只有写入了该名单的账号才能执行sudo指令。该文件位于 /etc/sudoers ,我们使用root账户打开:在该文件的100行左右,就能查看该白名单了,当我们将 user1 添加进白名单后,user1 就能正常使用 sudo 指令了。

(建议学完vim的使用后再进行配置修改)
这样大概能理解为什么使用sudo需要输入当前普通用户的密码了吧,因为配置文件时root已经默许了,输入当前用户密码只是确实是当前用户在操作。

sudo的使用场景:

目前我们比较常见的使用场景就是下载软件时使用了。比如 sudo yum install ... / sudo apt install ,,,

普通用户使用 sudo 并输入密码后,短时间(大概15min)以内再次使用sudo是不需要输入密码的。


三、文件属性和访问权限

前面说过,权限=角色+事物属性,而在Linux中,一切皆文件,文件的属性就和权限密切相关

1.对文件属性的基本了解

首先通过 ll 就可以快速查看文件的属性:现在我们来认识文件的这些属性:关于后面3列:文件大小、修改时间、文件名,这些是我们比较熟悉的属性就不多说了。我们先具体认识一下文件类型有哪些:d:目录(文件夹)-:普通文件c:字符设备文件,例如屏幕等串口设备b:块设备文件,例如硬盘、光驱等p:管道文件l:链接文件,类似Windows的快捷方式

2.认识拥有者和所属组

第一列用户名代表的就是该文件的拥有者,一般谁创建就是谁;第二列用户名就代表该文件的所属组,默认是创建者单独一组,不过可以修改。Linux中的角色分3类:文件拥有者、文件所属组、otherother不需要存储,只要是拥有者或者所属组就一定不是other,所以other不显示注意角色是一层身份,它需要依附于具体的人,人 = 真实的人+身份角色所属组存在的原因,是多人使用同一台服务器时,便于分组管理权限,比如某些文件哪些人可看那些人不可看就可以通过所属组实现。接下来我们来看具体的访问权限:

3.认识文件的访问权限:

首先需要知道这些权限:r 代表可读权限、w 代表可修改权限、x 代表可执行权限。除去第一列代表文件类型的字符,剩下的9个字符每3个为一组,分别代表拥有者权限、所属组权限、other权限。(- 代表无此权限)以拥有者为例,rwx 一组,这3个字母的位置是固定的,有这个权限对应位置就有这个字母,没有就是 - 。下面我们来讲如何修改这些权限:

四、chmod 指令

1.用法1:chmod  [角色字符][+/-/=][权限]  [文件名]

chmod 指令就是用来设置文件的访问权限。

角色字符:u:拥有者g:所属组o:其它用户a:所有用户

+ / - / = :+:向权限范围增加权限代号所表示的权限-:向权限范围取消权限代号所表示的权限=:向权限范围赋予权限代号所表示的权限

常用选项:R -> 递归修改目录文件的权限说明:只有文件的拥有者和root才可以改变文件的权限

演示:

取消拥有者w权限,使其无法写入文件:取消拥有者r权限,使其无法读文件:取消所属组的rw权限:取消other的r权限:一次性给三位角色增加不同权限:一次性取消三位角色的不同权限:给所有人增加r权限:给所有人取消r权限:最后,给所有人增加所有权限:(绿色一般代表可执行文件,但test.txt并不是一个可执行文件)Linux下能执行 = 真的是一个可执行文件 + 可执行权限给所有人取消可执行文件:注意,取消权限时即使有角色对应权限本来就没有,也不会有影响,所以 a-rwx 就能直接取消全部权限。然后如果增加或者取消权限时,没有带上用户字符,直接 + 或者 - 权限时,默认是给所有人加减权限。只有文件的拥有者和root能修改文件的访问权限

“Permission denied” 的核心翻译是 权限被拒绝


一些结论

(1)root不受访问权限约束:

(2)文件识别访问者身份时,只会识别一次
你有没有疑惑过,一个用户既是文件的拥有者又是文件的所属组,那他能通过所属组的权限来访问文件吗?如:很明显,user1作为拥有者和所属组,如果对应拥有者权限没有,即使对应所属组有权限,那user1也不能访问文件。这就是因为文件在第一次识别操作者身份时,会依次对比其是否为:拥有者->所属组->other。一旦识别到操作者身份为拥有者时,就不会往下识别了,以后该操作者只能使用拥有者的权限。同理,如果操作者为所属组,在文件第一次识别到操作者身份是所属组后,以后该操作者只能使用该文件的所属组权限。我们可以使用 chgrp 指令修改所属组对应的用户(下文详说)

    2.用法2:chomd [数字] [文件名]

    3个字符为一组的权限,每个位置有两种情况  (r/-)(w/-)(x/-),在C语言中1表示有0表示无,所以 rwx 可以用二进制 111 代替,换算为八进制就是 7。所以每组权限无非以下8种情况:000、001、010、011、100、101、110、111;并且可以用八进制代替表示:0、1、2、3、4、5、6、7所以chmod加数字就能设置文件权限如:给拥有者和所属组设置rw-(110 / 6)权限、给other设置r--(100  / 4)权限如:给所有人所有权限如:去掉所有人所有权限

    两种方法各有好处,自行选择即可:用法1可读性强,用法2便捷性强


    五、chgrp 和 chown 指令

    1.chgrp指令

    用法:chgrp [用户名] [文件名]功能:修改文件或目录的所属组

    演示:注意普通用户需要sudo提权现在txp用户就能使用该文件的所属组权限了:注意:以上操作在其他用户的家目录下可能不成功,这是因为家目录也存在权限,我们可以在根目录下创建一个所有人都有完整权限的目录进行操作验证。


    2.chown指令

    用法1:chown [用户名] [文件名]说明:修改文件的拥有者,需要root权限或者sudo提权用法2:chown [用户名]:[用户名] [文件名]说明:同时修改文件的拥有者和所属组,同样需要root或者sudo提权

    演示:修改拥有者:此时user1不具备拥有者权限,只有所属组权限:同时修改拥有者和所属组:

    温馨提示:如果一个用户对某文件没有 r 权限,那么该用户无论用什么工具(包括但不限于:nano、vim等)都无法查看文件内容


    六、目录权限

    前面我们都是在说普通文件的权限,那么对于目录的权限有什么不一样呢?

    下面是使用root用户在根目录下创建的一个全权限的目录:现在,我们来了解目录的 r w x 权限分别对应什么功能:

    1. 对于目录的 r 权限,如果没有就无法查看该目录下的所有文件和文件内容演示,只去掉 r:

    2. 对于目录的 w 权限,如果没有就不能修改该目录下的所有文件,包括创建、删除、移动、拷贝等操作演示,只去掉 w:

    3.对于目录的 x 权限,如果没有就无法进入该目录演示:只去掉 x:

    家目录,只有对应的拥有者拥有权限,其他普通用户没有任何权限:

    同样,对于根目录,只有root有修改的权限:


    七、缺省权限

    1.什么是缺省权限

    缺省权限其实就是我们在创建文件或目录时系统默认给出的权限,一般对于普通文件缺省权限为664(rw-rw-r--),对于目录缺省权限一般是775(rwxrwxr-x):但这缺省权限其实并不是文件的初始权限,对于普通文件的初始权限一般为666(rw-rw-rw-),对于目录的初始权限一般是777(rwxrwxrwx),那为什么最终会变为缺省权限的664和775呢?这其实的奥秘就是权限掩码->umask

    2.权限掩码: umask

    使用指令 umask 就能查看当前的权限掩码:一般默认就是002,最前面那个0暂时可以忽略。哪权限掩码是做什么的呢?权限掩码的功能:设置缺省权限权限掩码设置缺省权限的原理:缺省权限 = 起始权限 & (~umask)说明:这其实是二进制的位运算,缺省权限等于起始权限的二进制码与权限掩码的反码的与运算结果。演示:664 和 775 的缺省权限由来

    设置缺省权限演示:

    用法:umask [数字]例如1:设置权限掩码为 000,效果就是初始权限是多少就是多少,也就是666和777例如2:设置权限掩码为777,因为其反码为000,0&任何都是0,所以效果就是权限为0

    umask设置缺省权限在一些常见下还是有意义的,更加方便初始化文件的权限等等


    八、粘滞位

    1.什么是粘滞位:粘滞位其实就是将目录权限的最后一位,也就是other的x权限修改为 t用法:chmod +t [目录](普通用户需要sudo提权)说明:粘滞位只能给目录设置,不需要给普通文件设置

    2.粘滞位有什么用:在设置了粘滞位的目录下,用户创建的文件其他人无法删除,只有文件的拥有者具有删除文件的权限。root无视

    粘滞位的用处:

    比如现在需要一个共享文件,那么root可以在根目录下创建一个全权限的目录,提供给所有用户使用:现在,txp在该目录中创建一个文件,并限制其他人只有读的权限但是,不合理的是,其他用户可以直接删掉该文件:这里的原因就是目录给了所有人修改的权限,普通文件是否可删除在于目录是否给了w权限,所以为了解决这个问题,粘滞位就出现了,只要使用 chmod +t 给对应目录加上粘滞位,文件的删除只能是该文件的拥有者:先加上粘滞位,目录的最后一个权限位会变为 t:此时,txp 创建一个文件:其他用户就无法删除 txp 创建的文件了:只要该文件的拥有者或者root才能删除该文件:

    最后说明一下,Linux根目录中存在默认的共享目录:tmp

    很明显的能看到其粘滞位 t


    总结

            以上就是本文的全部内容了,感谢支持!

    Read more

    【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!

    【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!

    🔥 本文专栏:Linux网络Linux实践系列 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录:别害怕选错,人生最遗憾的从不是‘选错了’,而是‘我本可以’。每一次推倒重来的勇气,都是在给灵魂贴上更坚韧的勋章。 ★★★ 本文前置知识: 序列化与反序列化 引入 在之前的博客中,我详细介绍了序列化 与反序列化 的概念。对于使用 TCP 协议进行通信的双方,由于 TCP 是面向字节流的,在发送数据之前,我们通常需要定义一种结构化的数据来描述传输内容,并以此作为数据的容器。在 C++ 中,这种结构化数据通常表现为对象或结构体。然而,我们不能直接将结构体内存中对应的字节原样发送到另一端,因为直接传递内存字节会引发字节序 和结构体内存对齐 的问题。不同平台、不同编译器所遵循的内存对齐规则可能不同,这可能导致接收方在解析结构体字段时出现错误。 因此,我们需要借助序列化 。序列化 是指将结构化的数据按照预定的规则转换为连续的字节流。其主要目的是屏蔽平台差异,使得位于不同平台的进程能够以统一的方式解析该字节流。序列化通常分为两种形式:文本序列化 与二进制序列化 。 文

    By Ne0inhk
    【算法一周目】位间流转,数字律动——洞察 C++ 位运算中的精妙与哲思

    【算法一周目】位间流转,数字律动——洞察 C++ 位运算中的精妙与哲思

    文章目录 * 常见位运算 * 1. 位1的个数 * 2. 比特位计数 * 3.汉明距离 * 4. 只出现一次的数字 * 5. 只出现一次的数字 III * 6. 只出现一次的数字 II * 7. 判定字符是否唯一 * 8. 丢失的数字 * 9. 两整数之和 * 10. 只出现一次的数字 II 常见位运算 1. 判断一个数的二进制表示的第x位是0还是1 * (n >> x) & 1 2. 将一个数的二进制表示的第x位修改成1 * n |= (1 << x) 3. 将一个数的二进制表示的第x位修改成0 * n &= ~ (1 << x) 4.

    By Ne0inhk
    探索实现C++ STL容器适配器:优先队列priority_queue

    探索实现C++ STL容器适配器:优先队列priority_queue

    前引: 在算法竞赛中,选手们常常能在0.01秒内分出胜负;在实时交易系统中,毫秒级的延迟可能意味着数百万的盈亏;在高并发服务器中,每秒需要处理数万条不同优先级的请求——这些系统背后,都隐藏着同一种强大的数据结构: 优先队列(priority_queue) 作为C++标准库中最优雅的数据结构适配器,priority_queue完美封装了堆算法的高效性,却只需几行代码即可实现复杂优先级管理。本文将深入剖析: (1) 堆原理与优先队列的机械美学 (2)定制化优先级策略的高级技巧 (3)实战性能对比与编译器级优化 (4)在万亿级数据处理中的独特优势 目录 优先队列介绍 优先队列的渊源 实例化 插入元素 访问元素 获取元素个数 判断优先队列是否为空 删除堆顶元素 · 优先队列的模拟实现 类模板 插入元素 访问元素 获取元素个数 判断优先队列是否为空 删除堆顶元素 效果展示 优先队列介绍 优先队列priority_queue 是 C++ 标准模板库(

    By Ne0inhk

    2.22 STL 中string的学习

    1.什么是STL STL standard template libarary 标准模板库:是C++标准库的重要组成部分 不仅是一个可复用的组件库 而且是一个包罗数据结构和算法的软件框架 2.STL六大组件 容器 算法 迭代器 仿函数 适配器 分配器 3.STL三大境界 学习 熟练 扩展 string的学习 通俗理解 string就是一个会自己长大的字符数组 自带了很多工具函数 为什么使用string 自动内存管理 方便操作 安全(不会越界) 与C兼容 C++ string 类常用接口说明 1. 简介 string 是 C++ 标准库中的字符串类,封装了动态字符数组,自动管理内存,提供丰富的成员函数。使用 string 比 C

    By Ne0inhk