👉shell命令以及运行原理👈
其实,我们平时敲的指令都是可执行程序,都是用 C语言或 C++ 代码写的。那这些指令是什么在 shell 上运行起来的呢?shell 又是什么呢?
Linux 严格意义上说的是一个操作系统,我们称之为“核心(kernel)” 。但我们一般用户,不能直接使用 kernel。而是通过 kernel 的“外壳”程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel 呢?
从技术角度, shell 的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
- 对比 Windows GUI,我们操作 Windows 不是直接操作 Windows 内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符或者运行起来一个应用程序)。
而 shell 对于 Linux,也有着相同的作用,主要是对我们的指令进行解析,将指令解析给 Linux 内核。Linux内核运行的结果通过 shell 解析给用户。
帮助理解:假如你是一个闷骚且害羞的程序员张三,那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且又让你心动的姑娘如花。你看上了如花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给如花,而我们找到媒婆姓王,所以我们叫她王婆,她对应我们常使用的 bash。张三不能和如花直接沟通,就如同用户不善于和操作系统打交道,也不能直接和操作系统进行交互。
shell 除了降低用户和操作系统交互的成本,还有一个作用就是变相保护操作系统。因为当用户输入一些非法指令时,shell 就会拒绝执行该指令,这样就起到保护操作系统的作用了。
一般而言,shell 本身并不执行对应的指令,而执行指令是通过派生子进程的方式执行用户的指令。这样做是为了保护 shell。shell,是命令行解释其的一个统称,而 Centos 7 采用的命令行解释器是 bash。当用户登录成功后,第一个在系统上跑起来的程序就是 bash。
一个标准的 shell 命令提示符的组成格式
👉Linux权限的概念👈
Linux 下有两种用户:超级用户(root)和普通用户。
超级用户:可以在 Linux 系统下做任何事情,不受限制
普通用户:在 Linux 系统下做有限的事情,受权限的约束
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
命令: su [用户名]
功能:切换用户。 例如,要从 root 用户切换到普通用户 user,则使用 su user。
要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
注:当从普通用户切换到 root 用户(su、su root 或者 su - 指令),需要输入 root 用户的密码;而当 root 用户切换到普通用户(Ctrl + d 或者 su 普通用户名),则不需要输入普通用户的密码。因为 root 用户的权限是最高的。su 和 su root 指令切换到 root 用户的时候,并不会改变所处的路径,而su - 指令切换到 root 用户的同时将路径改为 root 的家目录,即 /root
当我们是 root 用户时,输入 ls /home 可以查看所有的普通用户。
当我是普通用户,我想要 root 用户的身份执行一条指令,但不想变成 root 用户,怎么办呢?那么我们可以使用 sudo 指令,该指令的使用需要改配置文件。当我们学了 vim 工具,再来做这个操作。
当我们第一次使用 sudo 命令时,是需要输入普通用户的命名的;当使用 sudo 命令时间间隔较短时,就不再需要输入普通用户的密码了。
没有将普通用户添加到配置文件中的情况
这种情况就相当于系统不信任这个用户,那么如何解决这种情况呢?我们需要将当前用户添加到配置文件 /etc/sudoers 中,现在我们暂时不配置,先使用 root 用户来进行操作。
那我们使用 sudo 指令进行提权的时候,让我们输入自己的密码,这是为什么呢?这是给受信任的普通用户提供最少的执行障碍,保护操作系统。
什么是权限?
- 权限是约束人的(某一个人或者某一类人)。例如:非会员不能看需要会员才能看的电影,不能听会员才能听的音乐等等。
- 目标对象(电影网站、音乐APP等)本来就没有对应的属性(业务)。例如:你不可能在电影网站上做 OJ 题。因为电影网站没有这样的业务,那么你也就没有在电影网站上面做 OJ 题的权限。
通俗来说,权限就是一件事情是否允许被谁做。例如:Linux 的文件权限 = 人(角色) + 文件属性。
👉Linux权限管理👈
文件访问者的分类(角色)
一个人能做什么事,并不取决于这个人的名字是什么,而是取决于这个人的角色。比如:张三是某个学校的校长,他能够进入校长办公室,是因为他名字是张三就能够进入校长办公室吗?并不是,是因为他的角色是校长,所以他能够进入校长办公室。换了另一个张三,就不能进入校长办公室了。
那文件的访问者(角色)的分类有什么呢?
文件和文件目录的所有者: u—User(拥有者)
文件和文件目录的所有者所在的组的用户: g—Group(所属组)
其它用户: o—Others (其他人)
那普通用户和上面的三类访问者是冲突的关系吗?并不是,某个用户可能是一个文件的拥有者,也有可能是另一个文件的所属组或者其他人。文件的访问者是一种角色,或者说是一种身份,普通用户可以被赋用不同的角色(省份)。而操作系统约束的就是角色,并不是特定的普通用户(人)。
那么文件的三个角色究竟在哪呢?我们来看一下:
注:不属于拥有者和所属组的用户就是其他人。
为何要存在所属组?
在一个公司里,会存在两个团队做一个项目,那么谁把这个项目做更好,这个项目就归属于谁。那么团队 A 有团队 A 的代码目录,团队 B 也会有团队 B 的代码目录。这时候,就肯定需要所属组这样的概念。如果没有所属组这样的概念,那么其他团队的成员也能够看你们团队的代码了。所以所属组的概念也就必须存在。
文件类型和访问权限(事物属性)
文件 = 文件内容 + 文件属性。文件的属性包括读权限(r)、写权限(w)和可执行权限(x)。
那么,我们输入ll
指令,显示器上显示的都是文件的属性。
1.文件类型
- d:文件夹
- -:普通文件
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
各种文件的例子
虽然说 Linux 系统不以文件后缀来区分文件,但是这并不代表Linux 下的工具(如:gcc)可能会对文件后缀有要求。
刚才我们学习的一个字符是文件的类型,那么剩下的九个字符是文件的访问权限,那这是如何对应起来的呢?我们来学习一下。
2.基本权限
读(r/4): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(w/2): Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行(x/1): Execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
“-”表示不具有该项权限
剩下的九个字符三三为一组,第一组是拥有者的权限,第二组是所属组的权限,最后一组是其他人的权限。
如何描述文件的权限
以目录文件 dir 为例,dir 这个文件的拥有者是 Joy,所属组是 Joy。拥有者具有读权限、写权限和可执行权限,所属组具有读权限、写权限和可执行权限,其他人具有读权限、没有写权限和具有可执行权限。
文件权限值的表示方法
1.字符表示方法
2.8进制数值表示方法
文件访问权限的相关设置方法
如何操作权限呢?
操作文件的权限有两种:一是设置文件属性(chmod),而是设置文件所属角色(chown 或者 chgrp)。
注:当你是 root 用户或者是文件的拥有者时,才能更改文件的属性。
chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
① 用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
chmod u-r 文件名 #去除文件拥有者对该文件的读权限 chmod u+x 文件名 #给文件拥有者加上对该文件的可执行权限 chmod u-rwx 文件名 #去除文件拥有者对该文件的所有权限 chmod u+rw 文件名 #给文件拥有者加上对该文件的读权限和写权限 chmod g-rw 文件名 #去除所属组对该文件的读权限和写权限 chmod g+rwx 文件名 #给所属组加上对该文件的所有权限 chmod o-rwx 文件名 #去除其他人对该文件的所有权限 chmod u-rwx,g-rwx 文件名 #去除拥有者和所属组对该文件的所有权限 chmod a+rwx 文件名 #给所有人加上对该文件的全部权限 chmod a=rwx 文件名 #给所有人加上度该文件的全部权限
有和没有普通文件权限的样子