一. shell 命令及运行原理基本理解

1)广义理解的操作系统包括:操作系统内核、外壳程序(shell命令行、图形化界面)、必要的软件。

2)狭义的操作系统:操作系统内核。

3)在用户和内核之间有一个外壳程序(shell外壳),也叫命令行解释器,是操作系统外的一层软件层。
1. 它存在的原因:主要是因为人不擅长和内核交互,但是擅长和shell命令行、图形化界面等外壳程序交互。并且外壳可以变相的保护内核。
2. 它的作用:将用户的命令翻译给核心处理。同时,将核心的处理结果翻译给用户。

4)shell外壳是一个广义的概念,它包含了bash。即bash是一个具体的命令行解释器。
他有双重身份,既作为执行环境又作为一个可执行命令本身。
1. 作为外壳程序,他会一直循环的做四件事:打印提示符 --> 读取命令 --> 解释和执行命令 --> 返回结果。
2. 作为一个命令,执行这个命令会启动一个新的 Bash Shell 子进程,通常用于创建嵌套的 Shell 环境或执行脚本。

[root@hcss-ecs-116a ~]# ls /usr/bin/bash
/usr/bin/bash

5)有风险的命令,shell外壳程序可以创建子进程来做。这样就算子进程挂了也不会影响我们原本的外壳程序。

二. 权限

(一)什么是权限

权限决定了一个资源我们有没有权利访问,即能不能访问资源的问题。

(二)为什么要有权限

Linux是一个多用户操作系统,可能同时有多个人或账号进行登陆访问,有普通用户也有超级用户。如果不对部分用户加以限制,可能用户之间彼此会有不好的影响。所以权限的本质也是要进行更好的用户管理。

(三)权限 = 人 + 属性

权限针对特定的群体---与人有关(普通用户?超级用户?)。
目标主体必须具备对应的属性才能访问。根据Linux下,一切皆文件的特性,所谓的目标主体就是文件,而文件常见的属性有三个:可读(r)?可写(w)?可执行(x)?

用户的问题

1)超级用户(root):Linux中的特权级别,基本不受权限约束。可以随意切换到任意普通账号。

2)su指令---账号间的切换问题

1. 超级用户和普通用户之间

这个操作一般由拥有root账号的人做,因为超级用户通常也有自己的普通账号,他知道root账号的密码,需要在两个账号间切换。

[root@hcss-ecs-116a lsy]# whoami
root
[root@hcss-ecs-116a lsy]# su lsy
[lsy@hcss-ecs-116a ~]$ whoami
lsy
[lsy@hcss-ecs-116a ~]$ whoami
lsy
[lsy@hcss-ecs-116a ~]$ su root
Password: 
[root@hcss-ecs-116a lsy]# exit
[lsy@hcss-ecs-116a ~]$ su
Password: 
[root@hcss-ecs-116a lsy]# exit
[lsy@hcss-ecs-116a ~]$ su -
Password: 
Last login: Sat Sep  6 13:18:40 CST 2025 on pts/0
[root@hcss-ecs-116a ~]# logout

可以看到第三种普通账号切换到root账号的方式比其他两种方式多出了一行:Last login: Sat Sep  6 13:18:40 CST 2025 on pts/0   证明这种方式雀食是以重新登陆的方式切换账号的。

2. 普通用户和普通用户之间

有对方的密码即可切换

3)最佳实践:每个人老老实实用好自己的账号,不要切来切去。只有超级用户偶尔需要在root账号和自己的普通账号之间切换。

4)新建、删除用户,并设置密码

默认root账号才有的权力,普通用户只有修改自己密码的权力,普通用户也可以通过短暂提权的方式获得这项权利(马上会讲如何短暂提权)。
1. 新建、设置(更改)密码

[root@hcss-ecs-116a ~]# adduser lh
[root@hcss-ecs-116a ~]# passwd lh
Changing password for user lh.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@hcss-ecs-116a ~]# su lsy
[lsy@hcss-ecs-116a root]$ su lh
Password: 
[lh@hcss-ecs-116a root]$ whoami
lh

 2. 删除(千万别忘了加 -r !!)

[root@hcss-ecs-116a ~]# adduser lh
[root@hcss-ecs-116a ~]# ls /home
lh  lsy
[root@hcss-ecs-116a ~]# userdel -r lh
[root@hcss-ecs-116a ~]# ls /home
lsy

5)sudo 指令

如果一个普通用户想在系统中装一个软件,但是软件安装相当于将对应的文件拷贝到系统的指定目录下,操作系统不允许普通用户拷。
那是不是意味着所有类似于软件安装等的任务都只有root账号即超级管理员能做?答案是:不是的。
如果真的是这样,那超级管理员的工作量很大,每天安装个软件就有好多人找到他,让他做。同样的,也不可能将root密码给所有人,让他们随意切换到root账号进行软件安装等工作,否则权限对不同用户的约束力就消失了。

基于以上的问题,Linux给出了一个能让普通用户进行短暂提权的指令 --- sudo指令。
 1. 用法:sudo  你想做的指令  +  你自己的普通账号的密码

  • 这里普通用户想要短暂获取超级用户的权限,竟然只需要知道自己的密码就可以,那么不是所有人都和root账号没区别了么?并不是这样的。
  • sudo是现代Linux系统安全和管理的最佳实践之一,在普通账号创建之初是默认没有使用sudo的权力的,系统通过白名单(一个特殊的配置文件 /etc/sudoers,这个文件定义了哪些用户、在哪些主机上、可以以谁的身份、运行哪些命令)机制管理谁可以进行提权操作。将普通用户添加到这个文件里或者加入一个在sudoers文件中指定的用户组,这个普通用户才获得了使用sudo的资格。
  • 普通用户想用sudo变身为root,光知道自己的密码远远不够,最关键的是需要root提前在系统里给他“开权限”;一旦开了权限,他的一切超级操作都会被记录在案,责任到人,这和直接拥有root账号是完全不同的两回事。
  • 让输入自己的密码主要是为了安全性和责任追溯,确认是你本人在执行这个特权操作,而不是别人在你忘记锁屏的电脑上胡乱操作。这强化了“谁操作,谁负责”的原则。系统日志会清晰记录sudo的使用情况。如果使用统一的root密码,出了事无法查清是谁干的。同时也减少了root密码泄露的风险。
[lsy@hcss-ecs-116a ~]$ sudo touch test.txt
[sudo] password for lsy: 
lsy is not in the sudoers file.  This incident will be reported.

sudo可以进行短暂的提权,当我们输入密码成功,之后的一段时间(从认证的角度看,默认有效期是15分钟(可配置))都不用再输入密码

角色的问题

1)角色,对于一个文件,存在三种角色。
1. 拥有者(user) --- 文件是谁建的
2. 所属组(group) --- 文件属于哪个组,对文件进行组级别的管理
3. 其他所有用户(others)--- 不是拥有者,也不是所属组,就是others

2)权限是依附于角色的,角色是需要人来扮演的。

3)使用 ll 指令查看文件属性:

属性从左到右依次为(后面以上图为例):
1. 文件类型:-
2. 拥有者权限:rw-
3. 所属组权限:r--
4. others权限:r--
5. 硬链接数:1(这个暂时还不需要理解,后面会讲到)
6.  拥有者:root
7. 所属组:root
8. 文件大小:72
9. 最后一次修改时间:Sep  8 10:01
10. 文件名:test.txt

1. 显然,我们可以直接在属性中查看到文件的拥有者和所属组是谁,但是没有单独列出others,是因为不需要,系统在识别访问者的角色之后会拿来和拥有者、所属组对比,如果都不是就认为是others。

2. 单独的一个人,比如root、lsy...都可以做一个组。

4)什么是所属组?为什么要有所属组?
1. 所属组(Group)是一个用户的集合。 它是Linux系统中用于组织用户和管理权限的一个基本单位。
2. 所属组的意义,简单来说:在同一个组中,方便一个团队的伙伴共享资源,却又能限制其他不在组中的用户,不能随意访问组中资源。所属组的意义还有很多,详细地可以问一下大模型!

文件权限属性问题

1)常见的三个文件属性
1. 可读(r)
2. 可写(w)
3. 可执行(x)

2)1. 

2. 

r 代表角色对文件有可读权限
w 代表角色对文件有可读权限
x 代表角色对文件有可执行权限
- 代表没有某项权限

3. 从左到右必须是rwx的顺序,不能像指令选项一样,随便交换顺序。

 4. 小总结:如何正确描述一个文件的权限(以test.txt为例)
该文件的拥有者是root,所属组是root。该文件对应的拥有者的权限是可读可写不可执行,该文件对应的所属组的权限为可读不可写不可执行,others对该文件的权限是只能读不可写不可执行。

权限的指令操作

权限 = 人 + 文件属性


所以在操作上要么改变人(用户或角色),要么改变文件属性(可读?可写?可执行?)

1)chmod指令(change mode,改变模式)

文件属性只有root和文件拥有者能改文件属性,需要使用chmod指令。

超级用户的命令行提示符是#,普通用户的是$

 1. 语法:chmod  角色名+/-某属性  文件名

角色名某属性
u(拥有者)r(可读)
g(所属组)w(可写)
o(others)x(可执行)
a(all,所有角色)

 2. 示例

[root@hcss-ecs-116a dira]# ll
total 4
-rw-r--r-- 1 root root 72 Sep  8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod u-r test.txt
[root@hcss-ecs-116a dira]# ll
total 4
--w-r--r-- 1 root root 72 Sep  8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod u+r,g+rwx test.txt
[root@hcss-ecs-116a dira]# ll
total 4
-rw-rwxr-- 1 root root 72 Sep  8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod o+wx test.txt
[root@hcss-ecs-116a dira]# ll
total 4
-rw-rwxrwx 1 root root 72 Sep  8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod a-rwx test.txt
[root@hcss-ecs-116a dira]# ll
total 4
---------- 1 root root 72 Sep  8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod a+rw test.txt
[root@hcss-ecs-116a dira]# ll
total 4
-rw-rw-rw- 1 root root 72 Sep  8 10:01 test.txt

2)修改文件属性的八进制方案
1. 对于rwx这按个属性,一个文件只有  有(r/w/x)和没有(-)这两种状态,那么我将有认为是1,没有认为是0,就又可以多出一种修改文件属性的方案。因为文件属性是三位一组、一共三组的,而三位二进制数最大能表示到八进制的7,三组并列表示不会进位,刚好是一个八进制数。

2. 比如对于u(拥有者)这一组,我要为他加上所有权限 rwx  =>  111  =>  7(转换为八进制:4+2+1=7)。同理我要g这一组没有任何权限 ---  =>  000  =>  0,o这一组只有只读属性 r--  =>  100  =>  4。那么三组按顺序就是:704。我们可以验证一下是否像我们预想的设置了文件权限。
3)总结
如何修改文件属性有两种方案:
1. ugo +- rwx
2. 八进制方案

没有权限会怎么样

1)此时lsy作为拥有者,有对文件的读写权限。

2)当去掉他的读写权限时:

3)该文件的拥有者和所属组都是lsy,所以root属于others,我们去掉others的读写权限,发现root依然可以对文件进行读写操作。体现了root账号是Linux中的特权级别,不受权限约束。

4)Q&A
1.  为什么文件的拥有者要去掉自己的权限?

 ① 最主要的原因就是要增强安全性,防止自身的误操作导致数据丢失或者服务中断。
合规性与审计要求。确保某些文件(比如财务日志、审计追踪文件等)不可篡改,满足监管要求。
③ 其他场景还有很多不同的意义,所以文件拥有者主动放弃自己的一些权限其实是一种更高级、更精细的控制形式,体现对系统安全性和稳定性的深刻理解。

 2. 在2)的例子中,lsy作为文件的拥有者虽然没有读写权限,但是他同时还是文件的所属组啊,明明所属组有读写权限,为什么事实上lsy不能进行读写了?

 因为:用户访问文件时,系统就会验证他的身份,并确定他相对于该文件是什么身份。这个验证只会做一次(权限只会验证一次),也就是说系统识别到 lsy 是文件的拥有者之后就确定了他是拥有者,不会再和后面的所属组比对了。

如何证明呢?

1.  间接证明:其实这个问题就已经间接证明了,如果会验证多次的话,在拥有者失去权限时,系统就应该向后匹配是否是所属组或others,是否有对应的权限。

2.  直接证明,现在我把拥有者换了,理论上就可以匹配到所属组这一步了。

(这里用到了一个chown指令,比较见名知意,就是改变文件拥有者的指令,稍后在下面会再正式提出一次)

3. 关于可执行属性

不是有了可执行属性文件就可执行了,一个txt文件他也执行不起来啊。可执行属性相当于给了文件一个入场券,代表着你想执行我不拦着你,但是能不能真正执行起来还要看你自己的本事(是不是一个可执行的二进制文件)。
综上,文件想要真正的执行起来需要两个条件
① 文件本身就是一个可执行的二进制文件。
② 文件拥有可执行权限。

权限中与人有关的话题

1)chown指令(change own,更换文件拥有者)
2)chgrp指令(change group,更改文件所属组)

3)同时改:chown lsy:lsy test.txt
没有指令:chgrp root:root test.txt

4)没有单独改others的指令,因为并不需要,改变拥有者和所属组就是改变others了(不是拥有者也不是所属组就是others)

5)从上图中我们可以看出:作为文件的拥有者,lsy却不能更改文件的拥有者和所属组(文件拥有者可以改变各角色的权限),为什么呢?

因为你改一个属于你的文件的权限那是你自己的事情,允不允许谁看、写、执行都是你自己的事情。但是想改文件的拥有者和所属组就和别人有关了,相当于把你这个文件给了别人。现实中你想要把一个东西给别人也要征得别人的同意,因为谁知道你给的是什么,万一是“脏水”呢,对方可能会被迫承担责任。
但是我们linux中没有能去征得对方同意的方法,只能通过超级用户的权限强行改。但是有强行改的方法如何避免我们可能会被迫承担责任这件事呢?不用担心,普通用户想要提权必须通过sudo,前面也说过了,能使用sudo的一定是系统白名单上的用户,也有日志记录易于追责。

文件类型

属性中第一个位置的-就是文件属性,它属于普通文件。当然linux中的文件类型不止这一个(我们只介绍几个常见的):

类型标识符文件类型名举例演示指令
-普通文件文本、二进制、图片、源码等ll
d目录文件文件夹ll
l链接文件ls /usr/lib64/ -l
p管道文件用于进程间通信,和我们之前提到的管道 | 是一回事,| 是匿名管道,管道文件是命名管道

mkfifo fifo

ll

c字符文件键盘、显示器(按照顺序输入输出,不支持随机读写。我们printf、scanf、cin、cout操作的都是字符)ls /dev/pts/ -l
b块设备文件磁盘(典型的块设备)(支持随机读写,读写的基本单位以块为单位,通常4kb、512字节)ls /dev/vda* -l

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96044.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96044.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96044.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.python——字符串

python中用’ 和" "创建字符串 python的子字符串截取用[]取字符串拼接可以直接用相加。 python三引号允许一个字符串跨多行,其中无需进行转义(所见即所得)。 当你需要一块HTML或者SQL时,这时用字符串组合,特…

足球数据API接口的技术特性与应用价值分析

一、接口概述现代足球数据接口是基于RESTful架构的数据服务,通过标准化方式提供赛事相关信息。这类接口通常采用JSON格式传输数据,支持跨平台调用,为开发者提供结构化的足球赛事数据。二、数据覆盖范围主流足球数据接口通常包含以下数据类型&…

<android>反编译魔改安卓系统应用并替换

我们知道安卓系统基于稳定性、维护便利、性能优化等原因并未对原生系统apk进行混淆加密处理,由此就方便了我们反编译替换原生应用。 首先我们设备需要是root后的,我是使用的是小米5,刷的24.3版本的面具。首先我们需要取系统apk,这…

【Qt】项目的创建 and 各个控件的使用

一、项目的创建🔍然后点击新建项目。📖注意:路径不要带有中文,不然运行不了代码。📖qmake是一个构建工具,在 Qt 写的程序,设计的到一系列的 "元编程" 技术,什么是元编程技…

大模型架构演进全景:从Transformer到下一代智能系统的技术路径(MoE、Mamba/SSM、混合架构)

当前大模型发展正经历着一个关键的技术分水岭。虽然Transformer架构自2017年问世以来主导了整个AI领域,但我们正见证着多种创新架构的涌现,每种都在试图解决Transformer的固有局限。本指南将系统性地解析当前主流架构的技术原理、适用场景与发展趋势&…

画世界笔刷合集(2000 + 款):含宫崎骏森系、鸭风人像、国潮等多风格 + 视频导入教程

预览: https://blog.csdn.net/2501_93092597/article/details/151330089?spm1011.2415.3001.5331 想在画世界创作却缺适配笔刷?手动绘制森系元素、人像细节耗时久,导入笔刷总失败,找配套背景 / 配色还得跨平台搜索?这…

03-Redis 安装指南:从版本选择到多系统部署(Windows+macOS+Linux)

目录引言一、安装 Redis 前必须明确的核心问题二、Redis 版本选择:稳定版 vs 开发版,该怎么选?2.1 版本规则:看 “次版本号” 辨稳定性2.2 稳定版与开发版核心差异2.3 版本选择建议三、多系统安装教程:step-by-step 实…

普通MYSQL数据库是怎么做sum操作的

MySQL 的 SUM()操作实现是一个结合​​执行引擎优化、存储结构利用和分组算法​​的高效过程。以下是其核心实现机制和优化策略:​​1. 执行流程概览​​以查询为例:SELECT department, SUM(salary) FROM employees GROUP BY department;​​执行步骤​​…

Claude-Flow AI协同开发:基础入门之 AI编排

1.1 引言:超越“代码生成器”的革命 在AI辅助开发的浪潮中,我们已经习惯了代码补全、函数生成等“代码生成器”工具。它们极大地提升了我们的编码效率,但通常仅限于解决孤立、单一的问题。当面对一个完整的项目或一个复杂的功能模块时&#x…

Linux中下载安装部署Redis7.4.5——并设置用户名、密码及其授权的保姆级教程

一、环境准备 环境准备 序号 说明 1 使⽤RHEL9或Almalinux9.1及其更高版本系统 #查看系统信息 cat /etc/os-release 2 Linux中需要Redis源码编译所需的gcc依赖 #1-检查是否已

健康度——设备健康续航条

在故障诊断与健康管理(PHM)领域和寿命预测领域中,健康度(Health Index, HI)是一个至关重要的概念,它旨在量化设备或系统的当前健康状态,并为预测其剩余使用寿命(Remaining Useful Li…

【Python - 类库 - BeautifulSoup】(02)使用“BeautifulSoup“按类名获取内容

使用BeautifulSoup按类名获取内容 在本文中,我们将介绍如何使用BeautifulSoup按类名获取内容的方法。BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以方便地遍历和搜索文档树,使得我们能够轻松地提取想要的信息。 安装BeautifulSoup 首先&a…

36.Java序列化与反序列化是什么

36.Java序列化与反序列化是什么 序列化就是把Java对象转换成字节流(二进制)。 把对象保存到本地文件或网络传输。因为Java对象在JVM的堆内存中,JVM堆不存在了,对象也就不在了。 反序列化就是把字节流转换为对象 从文件或者网络里获…

c#泛型公共类示例

在C#中&#xff0c;泛型类是一种可以操作多种数据类型的类。这使得你可以编写更灵活、可重用的代码。泛型类通过在类名后使用尖括号<>和类型参数来定义。类型参数可以是具体的类型&#xff0c;如int或string&#xff0c;也可以是其他泛型类型&#xff0c;甚至是其他泛型类…

深入理解算法效率——时间和空间复杂度详解

目录 一、引言&#xff1a;为什么我们需要分析算法效率&#xff1f; 二、算法效率的维度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.2 空间复杂度&#xff08;Space Complexity&#xff09; 三、深入理解算法时间复杂度 3.1 时间复杂度的基础概念 3.2 大…

排序---冒泡排序(Bubble Sort)

一、算法核心概念 冒泡排序是一种简单的交换排序算法&#xff0c;其核心思想是&#xff1a;通过重复遍历待排序数组&#xff0c;每次比较相邻的两个元素&#xff0c;若它们的顺序错误&#xff08;如升序排序中前一个元素大于后一个&#xff09;&#xff0c;则交换它们的位置。经…

MCP(模型上下文协议)入门教程

MCP&#xff08;模型上下文协议&#xff09;入门教程&#xff1a;连接AI与外部世界的万能插座 1 MCP是什么&#xff1f; 1.1 基本概念 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是一个开放协议&#xff0c;专门用于AI模型与外部数据源和…

GO开发遇到的报错问题合集

本文将记录平时在go开发中遇到的一些错误信息&#xff0c;踩过的坑&#xff0c;并分析原因及提供解决方法&#xff0c;持续更新中...1、grpc 接口请求报错&#xff1a;Error: 13 INTERNAL: Response message parsing error: invalid wire type 7 at offset 316原因&#xff1a;…

Node.js 做 Web 后端优势为什么这么大?

Node.js自诞生以来&#xff0c;一步步演变变为现代Web后端开发的基石之一。无论是初创公司快速构建原型&#xff0c;还是大型企业支撑高并发业务&#xff0c;好像它哪儿哪儿都在&#xff0c;甚至还有人觉得它威胁到了PHP的地位。 那为什么Node.js 做 Web 后端优势那么大&#x…

JAVA:IO流之字节输入流InputStream基础

我们知道&#xff0c;文件是写在磁盘中的&#xff0c;而程序的运行又要借助于内存。那么怎么实现内存和磁盘的“互动”呢&#xff1f;这就要借助“流”来实现了。内存具体指的就是我们的java程序&#xff0c;而磁盘具体指的是我们的文件。从磁盘到内存叫输入&#xff0c;从内存…