.Jammy.头像
关注
Linux权限:shell命令以及运行原理和Linux权限封面图

Linux权限:shell命令以及运行原理和Linux权限

目录

一.shell命令以及运行原理

二.Linux权限

2.1Linux权限管理

2.1.2sudo讲解

2.2.2认识文件权限

2.2.3认识目录权限

2.2.4理解Linux多用户之间是怎么隔离的

2.2.5缺省权限

2.2.6共享目录


一.shell命令以及运行原理

Linux 严格意义上说的是一个操作系统,我们称之为 “核心(kernel)“,但我们一般用户,不能直接使用 kernel。而是通过 kernel 的 “外壳” 程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel?

从技术角度,Shell 的最简单定义:命令行解释器(command Interpreter)主要包含:

  • 将使用者的命令翻译给核心(kernel)处理。
  • 同时,将核心的处理结果翻译给使用者。

对比 windows GUI,我们操作 windows 不是直接操作 windows 内核,而是通过图形接口,点击,从而完成我们的操作(比如进入 D 盘的操作,我们通常是双击 D 盘盘符。或者运行起来一个应用程序)。

shell 对于 Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给 Linux 内核。反馈结果在通过内核运行出结果,通过 shell 解析给用户。

为什么需要shell外壳程序?

1. 内核的缺陷:只能识别系统调用,不认识人类命令

内核只提供一套底层接口 ——系统调用(open、read、write…) 它看不懂:ls、cd、mkdir 这种英文命令。

假设没有 Shell: 你想看目录,不能输入 ls 你必须手动编写程序,连续发起一堆系统调用去读取磁盘目录。 门槛极高,普通用户根本无法使用计算机。

Shell 的第一价值:把人类易懂的命令 → 翻译成内核能听懂的系统调用

2. 隔离保护:用户不能直接访问内核

CPU 分为两种运行状态:

  • 内核态:内核运行,拥有全部硬件权限
  • 用户态:普通程序运行,权限受限

用户直接操作内核极其危险: 误操作容易破坏文件系统、篡改内存、崩溃系统。

工作流程: 用户 → Shell(用户态)→ 发起系统调用 → 短暂进入内核态执行 → 返回 Shell 充当安全缓冲,限制用户随意调用内核底层功能。

3. 统一交互入口,简化操作

Shell 提供一套标准语法: 命令、参数、通配符 *、管道 |、重定向 > >> 如果没有 Shell,每个程序都要自己实现: 文件匹配、输出重定向、连续命令串联。

二.Linux权限

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

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

命令:su [用户名] 功能:切换用户。 例如,要从 root 用户切换到普通用户 user,则使用 su user。 要从普通用户 user 切换到 root 用户则使用 su root(root 可以省略),此时系统会提示输入 root 用户的口令。

补充课堂小知识点(拓展)

  1. su 和 su - 的区别
  • su root:只切换用户身份,不加载 root 环境变量
  • su - root:完整切换,登录式切换,加载目标用户全部环境(推荐)
  • sudo:普通用户临时借用 root 权限,需要输入密码,有10-15分钟再次调用不要密码。

注:超级用户切换为普通用户不需要输入密码,普通用户切换为超级用户需要输入密码

2.1Linux权限管理

下面我们用实例进行演示:

执行了 cd /,你现在处在 Linux 根目录 / 也就是整个文件系统的最顶层,所有目录都挂载在它下面。

/
├── bin    → 软链接指向/usr/bin,基础用户命令
├── boot   → 内核、启动相关文件
├── dev    → 设备文件(硬盘、网卡、串口等)
├── etc    → 系统各类配置文件(重中之重)
├── home   → 普通用户家目录存放处
├── lib/lib64 → 系统共享库
├── lost+found → 文件系统异常找回文件
├── media  → 自动挂载U盘、光盘等外设
├── mnt    → 手动临时挂载目录
├── opt    → 第三方大型软件安装目录
├── proc   → 伪文件系统,存放进程、内核实时信息(内存里,无磁盘占用)
├── root   → root超级用户自己的家目录(和普通用户不在home下)
├── run    → 运行时临时数据,进程pid、套接字
├── sbin   → 管理员命令,软链接/usr/sbin
├── snap   → snap应用目录(Ubuntu特有)
├── srv    → 服务数据目录
├── sys    → 伪文件系统,内核硬件信息
├── tmp    → 临时文件目录,所有用户可读写,系统定期清理
├── usr    → 用户程序、文档、库(unix system resource)
└── var    → 动态可变数据:日志、缓存、数据库文件

2.1.2sudo讲解

sudo = superuser do 作用:普通用户临时获取超级管理员权限执行一条命令

核心特点(必背)

  1. 不需要知道 root 的密码!只需要输入自己普通用户的密码
  2. 权限是临时、单次生效,只作用于当前这一条命令
  3. 权限受配置文件管控,管理员可以限定用户能执行 / 不能执行哪些指令

对比 su:

  • su:完整切换成目标用户身份,需要目标用户密码(切 root 就要 root 密码)
  • sudo:普通用户临时借用权限,输入自己密码

这里就想到,如果每个人都加个sudo不都成root用户了吗,不就可以随便修改?

这里后面会讲,只有将用户添加到这里面用户可以免密码放大权限,没有添加进来的,必须输入root用户密码才能放大权限,否则无法放大权限

2.2.2认识文件权限

拆分结构: - rw- rw- r--

  1. - → 文件类型(普通文件)
  2. 第 1 组 rw-:属主(拥有者 ubuntu)权限
  3. 第 2 组 rw-:属组(ubuntu 组)权限
  4. 第 3 组 r--:other(其他用户)权限 ✅

    问题一:为什么不见other?

    other 没有单独名字显示在 ll 输出里!

    • ll 输出只会打印:属主用户名、属组名
    • other = 所有不属于「属主」、也不在「属组」内的其余用户,是一个泛指群体,没有固定账号名称,所以不会展示。

    问题二:什么是所属组?为什么要有所属组?

    Linux 里可以把多个用户放进同一个组。 每个文件都绑定: 属主(单个用户) + 所属组(一个用户组)

    • 属主:ubuntu(文件拥有者)
    • 所属组:ubuntu(ubuntu 用户所在的用户组)

    规则划分三类身份:

    1. owner 属主:文件主人
    2. group 所属组:属于这个用户组里的任意成员
    3. other 其他人:既不是主人,也不在组内

    1. 方便批量授权,不用逐个用户设置权限

    场景:项目组有 A、B、C 三个开发,需要共同读写一批文档。 如果没有用户组: 文件主人只能给每个人单独开放权限,新增成员、移除成员要逐个修改,极其麻烦。

    有用户组之后: 把 A、B、C 加入同一个 dev 组; 文件归属 dev 组,给组设置读写权限。 只要调整组内成员,所有人自动继承权限,一键管理。

    2. 实现分层权限控制

    三类身份三层权限: 属主权限 > 所属组权限 > other 权限 可以做到:

    • 文件主人:最高权限(读写)
    • 同组成员:可以读写协作
    • 外部其他人:只能看,不能修改

    示例权限 -rw-rw-r-- 主人、同组用户可读写;外人只能读。

    3. 区分「所有者」和「协作人群」

    属主是唯一拥有者; 所属组是一群协作的人。 文件主人可以保留最高权限,同时开放权限给团队成员协同工作。

    所以现在我们已经知道了 权限=角色+属性 那么我们描述一下上面文件的权限信息是什么

    该文件是普通文件;

    文件拥有者 ubuntu 拥有读、写权限,没有执行权限;

    属于 ubuntu 用户组内的所有成员,拥有读、写权限,没有执行权限;

    除此之外的其他所有用户,仅拥有读取权限,不能写入和执行。

    如何修改权限呢?

    1.修改权限属性

    第一种采取加命令的方式进行修改

    第二种采取8进制进行修改

    2.更改权限角色

    可以用下列这种修改直接修改拥有者和所属组

    1. 修改文件【属主(owner)】,只有 root(拥有 CAP_CHOWN 特权)可以做到! 普通用户无权转让文件所有权。
    2. 补充一条容易混淆规则: 普通用户可以修改文件所属组,但有限制: 只能改成「你自己已经加入的用户组」。

    一句话区分: ✅ 改组:普通用户有部分权限 ❌ 换主人:只能 root 操作

    1. 防止磁盘配额绕过(资源管控)

    服务器一般会限制每个用户最大磁盘占用容量(磁盘配额)。 如果允许普通人随意把文件 “转送” 给别人: 用户 A 磁盘满了,直接把超大文件 chown 转给用户 B,逃脱自己容量限制,破坏资源管理机制。

    2. 防范安全漏洞、权限逃逸攻击

    如果用户可以自由转让文件拥有者: 攻击者可以创建带特殊权限(SUID 程序)的文件,转让给 root 或者其他高权限用户,利用文件提权入侵系统。 Linux 限制转让所有权,堵死这类攻击路径。

    3. 文件归属权责清晰

    文件所有权变更属于重要元数据变更,属于系统级管理操作。 系统设计思想:文件共享推荐用权限 / 用户组实现,而不是直接移交文件主人。 移交所有权属于重大变更,需要管理员(root/sudo)确认。

    4. 历史 UNIX 安全规范(POSIX 标准)

    这是 UNIX 系传统规则:文件可以共享,但不能随意 “送人”。 共享文件 = 开放 r/w 权限; 真正转移所有权,必须管理员介入。

    2.2.3认识目录权限

    2.2.4理解Linux多用户之间是怎么隔离的

    如何多用户查看和修改同一文件:

    2.2.5缺省权限

    创建目录和文件默认是下面的这种全限:

    对于普通文件来讲:起始权限 666,默认不带可执行

    对于目录文件来讲:起始权限 777,默认携带x

    出现这钟情况因为系统默认会存在一个掩码的概念

    为什么要有掩码:

    2.2.6共享目录

    我们先来看一个现象

    这里提出一个问题:如果两个人要同时对同一文件进行操作该怎么办?

    上面提供解决办法,但是太麻烦,这里我们可以将文件放在共享目录下,不在私人目录下创建这样就可以解决多人协作的问题了

    在根目录下创建一个文件任何人都可以看见,把权限改了,任何人都可以修改该文件

    我们可以看到在根目录下创建一个权限开外放的目录所有人都可以访问,那么别人能删我的文件吗?

    这里我们可以看出我们的文件别删除了,所以验证了前面说的删除文件只与目录的权限有关。

    但是这里有个问题:把文件数据放在共有既想让别人修改,又不想让别人删除,但这两个操作由w来决定,那么不就矛盾了,该怎么解决?

    这里我们引出一个知识点,叫做粘滞位,什么是粘滞位呢?

    正常目录:用户拥有目录 w+x → 可以删除目录内任意文件(哪怕文件是别人创建的) 开启粘滞位后: 目录即便有写权限,用户只能删除 / 重命名自己创建的文件,不能删除他人文件。

    典型例子:系统 /tmp 目录权限 drwxrwxrwt

    粘滞位作用于目录;设置粘滞位后,目录内用户仅可删除自身拥有的文件,无法删除其他用户创建的文件;常用于公共共享目录(/tmp)防止文件被随意删除

    这里我们可以看出把文件最后一个改为t别人就无法强制删除自己创的文件

    转载自 CSDN-专业IT技术社区

    原文链接:https://blog.csdn.net/Jammy_1/article/details/163782718

    文章来源转载

    评论

    赞0

    评论列表

    微信小程序
    QQ小程序

    关于作者

    点赞数:0
    关注数:0
    粉丝:0
    文章:0
    关注标签:0
    加入于:--