【看表情包学Linux】shell 命令及运行原理 | Linux 权限 | 文件权限的修改和转让 | 目录的权限 | Sticky bit 粘滞位(一)

简介: 本章我们将重点讲解 Linux 权限,这是 Linux 基础部分中非常重要的一部分。内容比较干,我会稍稍正经些去讲解。话不多说,我们直接切入正题。

💭 写在前面


本章我们将重点讲解 Linux 权限,这是 Linux 基础部分中非常重要的一部分。内容比较干,我会稍稍正经些去讲解。话不多说,我们直接切入正题。

Ⅰ. shell 命令及运行原理


0x00 什么是 shell

严格意义上说的是一个操作系统,我们称之为 ——  (核心),


但我们一般用户,是不能直接使用  的,而是通过  的 "外壳" 程序,


也就是所谓的  ,来与  进行 "沟通 " 。


中, 就是命令行解释器(command Interpreter),其主要包含:


① 将使用者的命令翻译给  处理。  ② 同时将  的处理结果翻译给使用者。


 中, 就是    (图形化界面),


我们操作  也不是直接操作  内核的,


而是通过图形接口,点击从而完成我们的操作,所以其实也是一个外壳程序。


对于 ,有相同的作用,主要是对我们的指令进行解析,


解析指令给  内核。反馈结果在通过内核运行出结果,通过  解析给用户。


0x01 shell 的意义

❓ 思考:为什么不能直接使用 ,而是要通过 ?


① 降低操作 OS 的成本:用户不善于和内核沟通,需要通过外壳来做解释。


②  保护操作系统:外壳的存在让内核不会暴露给用户,用户所有的非法、不合理操作会直接被外壳拦住,某种意义上来说是对操作系统的一种保护。


我们通常采用的命令行解释器,命令并不是 而是 bash,


它是存在于 /usr/bin 目录下的一个可执行文件:

4b79270e5888d46114cf5cb4ffa80e02_f8452a21691f4a0389dff2a371d51963.png


我们的  常用的命令行解释器(shell),叫做 bash。


他们两个之间有什么关系呢?  是所有解释器的统称,bash 是具体的一款解释器。


bash 属于  中的一种,常见的  工具:sh、bash、csh、tcsh、ash 等。


它们的关系就像是 Linux 和 Centos7.6 的关系,一个是统称的,一个是具体的。


Ⅱ. Linux 权限


0x00 Linux 具体用户的分类

Linux 的用户分为 root 和普通用户,root 为超级用户,就像 Windows 系统中的管理员。


超级用户:可以在 Linux 系统下做任何事情,不受限制。

普通用户:在 Linux下做有限的事情。

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

💭 确认当前你是哪个用户,可以输入 whoami 指令:


whoami

6931d0a56879ebff939b14363d7f92cf_0983aae35a0246208cc1b5fd4b07957e.png


💭 我们当前是普通用户,如果想切换至 root 用户,我们可以输入 su -


su -

affdd2e079460f6837a6146f0a66a765_7ffb356716b04053bfb7956f4960c689.png


root 和 Linux 下任何一个用户,都要设置密码。


建议不要把 root 密码和普通用户的密码设置成一样的! 这不仅是出于安全角度,


设置成一样的话现阶段容易搞混,你不知道什么时候要输的是什么密码。


这里我们要切到 root,所以输入的是 root 的密码:

fe63b0f31ac5b734ee252c3d988c0cba_d73291d16e764acf9f906da07153d393.png

(输入密码时是不回显的,并不是没输进去)


💭 实操:当我们 su - 并输入正确的密码后,就可以完成用户的切换操作:

$ su -
Password:

30f6c8fbdf5395f6c254381e3d6f40ee_c6462178f78a4e5ba185e1738fe426dd.png

在 root 用户下,想要切到普通用户甚至连密码都不需要输:


# su [用户名]

6cb933859652677e3a794eb7699d0d93_1489d09674e842c69fe687b50dc5964a.png

当然,如果你是普通用户想切换到另一个普通用户,当然还是需要输入密码的。


$ su [用户名]
Password:

root 什么身份都可以切,切到你账户删库跑路记录的还是你账户自己删的。


即便是不切,通过 root 拿你数据库的 "私♂密♂数♂据", 多危险!由此可见 root 账号非常重要!


root 密码一定不能设置的太简单!设置的太简单,就相当于是 "裸奔" !


0x01 Linux 中文件相关的权限概念

当我们输入 ls -l 显示详细信息时,你有没有注意过这些信息?

9d463f9db41855f02a76b7d55e1cd0fc_4d1ef431b7ab4960a37440fef96ca0f1.png

通过 ls -l 显示出来的是 文件的属性,而用过 cat 看到里面的是 文件的内容。

83cae6bef5687bf874b9e30a91cd183a_36c554ffa4d044bd8372eb799b6986e8.png


0x02 文件类型

我们既然要学习权限,我们重点要理解 ls -l 显示的若干的字母组合。


-rw-rw-r--
drwxrwxr-x

第一列的第一个字符,叫做 "文件类型" 。


Linux 中不是以文件名后缀区分文件类型的,而是通过 ls -l 显示的第一个字符区分文件类型的。


这有点颠覆我们的直觉,因为我们 Windows 是文件末尾 [ .类型 ] 的格式去区分文件类型:

bdece882eaf497c0d803bd3b67ab1ab1_1fedeccf68a24bc9bb6f5a494d16b716.png


而在 Linux 下你跟我说文件类型跟后缀没有关系?!我们验证一下看看:

37f0acd2703bb060510d677de43d3c65_2404d3bb2dcd4215a8656875b3e51694.png


在我们 Windows 下,这里的 a.txt 这就是一个文本,但是在 Linux 是完全不关心你后缀是什么的。


Linux 的文件后缀纯属摆设,我们写后缀只是是为了给自己看的。


📚 概念:Linux 是根据第一列第一个字符去区分文件的类型的。


- 普通文件,文本、源代码、可执行文件、第三方动态库等。

  目录文件

   链接文件(比如快捷方式)

  管道文件

  块设备文件,磁盘

   字符设备文件

📌 注意事项:


既然 Linux 文件后缀纯属摆设,那我们把 test.c 改成 test.txt,然后用 gcc 编译可以吗?

0b2fba6db8700ab6ff1ca767c18bde68_7f8fc7044679439bb64e82359f2a16cf.png

 ( 絕對不可以!)


虽然 Linux不以文件名后缀区分类型,但是 Linux 并不排斥以后缀做文件类型。


0x03 基本权限

❓ 思考:什么是权限?


① 约束人的(对人进行分类)


② 需要对应的事物具有特定的属性


Linux 上,对文件的权限:


这个文件谁能访问?这个文件谁不能访问?


对应的文件应该具备的某种属性:r,w,执行 x

bb54f6101a4a1234e5731de13e8c67cb_3be6ba9589274233ba53cd8718edae4d.png

所以权限的概念以及操作都是围绕人和概念的属性展开的。


在 Linux 系统中,人分三类:


① 文件的拥有者 owner     ② 文件的所属组 grouper       ③ 文件的其他用户 other


Linux 系统中文件的权限属性分为 r(读)、w(写)、x(可执行)。

b213c931740462d66d5b9b424ff0eaea_5a3f07e70dc8448b8085021ba7161cd7.png

root 和普通用户都可称为文件的拥有者、所属组、其他用户,他们并不冲突,反而是相互补充的。


每一组,对应的权限的为止含义是确定的。

e484e68eb8913fcdfbc8f0b7b2e05b06_ce2dc8be604e482d9b5455524bdf0ad4.png

那么文件的权限操作,应该涉及到几方面呢?  ① 修改文件的属性    ② 修改人


0x04 文件权限值的表示方法

📚 字符表示方法:

Linux 表示 说明 Linux 表示 说明
只读 仅可写
仅可执行 可读可写
可写可执行 可读可执行
可读可写可执行 无权限

只需要搞明白 r w x - 这四个字符分别代表说明意思,就能轻松理解。


📚 八进制数值表示方法:推荐使用 👍


权限符号(读写执行)
4 100
2 010
1 001
6 110
5 101
3 011
7 111
- - - 0 000

(利用八进制数值进行操作,用起来会非常的方便,等下面讲完文件的修改操作后再详细讲解)


0x05 file 指令

❓ 思考:如何区分一个文件?

ff92564453b924b925d9e424efa1546a_7b283d2374ee4ea68a20ce5641cc33c0.png

显然这一串信息是无法满足我们了,我们还有一个专门用来辨识文件类型的指令 —— file 指令。


file [选项] 文件或目录

🔨  功能:辨识文件类型


📜  常用选项:


-c  详细显示指令执行过程,便于排错或分析程序执行的情形。

-z  尝试去解读压缩文件的内容。

💭 操作演示:file

f5630895dcfaebf11e955a2be02aad0d_70eb62b0e3fd41ac9699eeb1a704a1ae.png


Ⅲ. 文件权限的修改


0x00 chmod 指令

chmod [参数] 权限 文件名

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


📜  常用选项:


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

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

chmod 命令权限值的格式:


① 用户表示符+/-=权限字符


+  向权限范围增加权限代号所表示的权限

-   向权限范围取消权限代号所表示的权限

=  向权限范围赋予权限代号所表示的权限

用户符号:  


u:拥有者

g:拥有者同组用

o:其它用户

a:所有用户

比如:

# chmod u+w /home/abc.txt
# chmod o-x /home/abc.txt

看蒙了也没关系,我们直接看操作演示,会轻松很多:


💭 操作演示:去掉某身份的权限

e7f579ec9133317c3e51d9bafaa28f15_a055c3cf87c3462d8be098af735c4e90.png


如果我想去掉某身份的读权限,我们可以:


chmod [分类]-[权限] {文件名]     # 去除权限

9c2ed70aa82633d82e7df9ea9d7d7512_2334402d46eb430a8839844e62d2174a.png

好,现在拥有者、所属组和 other 都没有读的权限了。


我们可以给让它们把读权限加回去吗?当然可以:


chmod [分类]+[权限] {文件名]     # 添加权限

237695eece261e94785b2dd2f6139102_d0e8c087b496425bb01e0983c4458146.png


0x01 指令的复合使用

当然,还允许复合使用:

c40596894134b6f0e8a902e64e293664_fca34194d98b4eb29a970e0b14c7d991.png


0x02 root 用户不受权限约束

当你什么权限都没有时,会受到种种限制:

6eb6a60f1f7bc8c80b9c0e4ac688e312_5323662ce1e64435ab474d8961080063.png


然而这些限制对至高无上的 root 来说,并没有什么卵用:

d58ce8f0d8e9cd349cdd2b3390af52b5_26ca8a8dd62b47e1b454787c9dd3bac7.png


0x03 八进制数值表示方法

讲完权限的修改了,我们再回到 Ⅱ.0x04  继续探讨 "八进制数值表示方法"。


权限符号(读写执行)
4 100
2 010
1 001
6 110
5 101
3 011
7 111
- - - 0 000

任何一个八进制数(0~7)都可以被写成三个比特位,这三个比特位壹壹和每一类人对应。


我们有三类人,则需要3个八进制数与之对应,所以就有了 777、000、333 等更改权限的方案。


譬如  的 - - - 分别对应   ,有或者无(两态),111 → 八进制 → 7。


→ 5 → 101 → ,原理是将八进制看作成二进制,对应上我们的权限。


💭 用法演示:八进制数值表示方法

a40d76bc3b18893767d0a48c597bf40c_872528454a604f5ebc148b3877b7a412.png

相关文章
|
1月前
|
Linux 应用服务中间件 nginx
Linux下权限设置之suid、sgid、sticky
Linux下权限设置之suid、sgid、sticky
|
2月前
|
安全 Shell Linux
从命令行界面运行交互式PHP Shell
从命令行界面运行交互式PHP Shell
|
3月前
|
安全 Linux
在Linux中,suid、sgid和sticky bit这几个术语意思?
在Linux中,suid、sgid和sticky bit这几个术语意思?
|
3月前
|
Ubuntu Linux Shell
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
|
3月前
|
Shell Linux 程序员
详解shell 运行原理及Linux权限
详解shell 运行原理及Linux权限
|
4月前
|
敏捷开发 Shell 测试技术
阿里云云效产品使用合集之如何用私有构建机运行shell命令打出的镜像作为下一个阶段的入参
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
23天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
499 2
|
1月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
27 0
|
2月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。