一. 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 |