Linux - Shell 权限 权限管理 权限修改 权限身份的认证 目录的权限 粘滞位

shell命令以及运行原理

 0a43ae521f954f318479ee6f7a4e9f30.png

 我们来输入指令的本质就是 输入字符串。

而指令的本质,就是编译好的文件和脚本,而只要是文件,就会在系统的特定路径下存放。

 我们使用所有的指令最终都要在 OS (操作系统)内部运行,但是 OS 使用难度比较高,我们直接使用 操作系统当中数据 是比较困难的。所以我们用户是不能直接使用 其中 的操作系统的,我们一般使用的都是 图形化界面 or 命令行解释器 这两种来实现 操作系统和 用户的交互。

 而在windows当中使用的就是 图形化界面,而且在 LInux当中使用的就是,用的 命令行解释器 来交互。

而 shell 就是 命令行解释器。Shell的最简单定义:

  • 命令行解释器(command Interpreter)主要包含:将使用者的命令翻译给核心(kernel)处理。
  • 同时,将核心的处理结果翻译给使用者
  • 保护OS,对于用户的非法请求,直接拦截

 如果我们输入的命令时非法访问 ,或者是 对操作系统当中的不能修改的文件,有修改的操作的,那么上述的 命令行解释器就可以帮我们识别,然后进行 相应的结束或者是提示。这就变相的保护了操作系统。

像上述说的 命令行 命令行解释器 bash sh shell 其实都是一样的。在windows当中  还叫做 图形化界面。

c8563ece7f9942919c6fb7c30a5fcc9d.png

 其中的 kernal 就是 Linux 内核。其中的 shell 对我们输入的指令进行解析,将解析的指令传给操作系统;操作系统将运行的结果,通过 shell 解析给用户。

 

Linux 权限

了解 Linux 当中的 用户分类 

 在Linux当中的并不说所有的操作都可以 使用的,在 Linux 当中有两种 用户:一种是 root 超级用户;一种是 root 用户新建的 (adduser)用户,叫做普通用户。

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

而在 Linux 当中有权限的限制,权限就是用来限制 用户进行某些 操作的,root 超级用户不受权限限制;而 普通用户 受到权限的限制。root 可以实现权限限制的操作,从这里来看 Linux当中 管理员的 权限是 比 windows当中的管理员高的;但是也不是就意味着 Linux 当中的 root 用户什么操作都可以实现,比如有些 操作系统正在使用的 文件 root 用户是无法访问的。

 而不管是 root 用户还是 普通用户都需要有 各自的密码,只要是用户都是有密码的。

 root 用户和 普通用户 之间的切换

其实 root 和 普通用户之间是可以 切换的,如果是  普通用户,使用 su 指令就可以实现切换。

如果现在你正处于某个普通用户当中,输入 su ,然后再输入 root 用户的密码就可以 切换为 root 用户:

618bcfb090a442edbea2534e34afa524.png

我们发现,系统就只提示了 password : 这样的字样,没有提示类似 password for xxx : 这样的字样;那么像 password:这样就是默认是 root 账号的密码,那么由此也就引出一个点,我们一般建议是,不要把 root 账号的和 普通用户的 账号 密码 设置为一样的密码

 如果我们进入了 root 用户想要退回到 之前的 普通用户,那么我们可以 输入 exit 命令 或者是 使用  ctrl + D 热键来退回到之前的普通用户:

be8abf93f4884f50873c7bef11328701.png

 我们还可以  使用  su -   这个命令 来从普通用户 登录 到 root 用户:

33b13374217b4456ac926f6f0e044be6.png

 此时我们发现 相对于 su 命令多了一行 Last login: 的字样,这表示 登入的意思。

也就是说 ,之前的  su 只是用户的切换 ,没有登录 root 用户,只是切换到 root 用户;而 su -  却是 登录到 root 用户。

 而 切换 和 登录的区别就是 ,切换只是切换 了用户,切换之后所处的 路径就是切换之前 所处的路径,而 登录之后会所处的路径是在 改用户的家目录下。

 如果当前你登录的是 root 用户,那么也可以使用  su  普通用户名 这个命令行来从root 用户切换到对应的 普通用户。

7d76a14ebd284da7a324aeaf3f77d611.png

 像上述的 例子,我们就从 root 用户切换到 gaobo 这个普通用户了,而且我们发现,没有 对应的password : 的输入,因为如果你是 root 用户,切换到其他普通用户的话,不需要输入密码,想切换到谁就切换到谁。如果我们想 退回到 root 用户,那么我们同样可以使用 crtl + D 或者 输入 exit 命令的方式退回到 root 用户

 我们来做一个比较,从一个 普通用户,像切换到另一个普通用户的话,还是需要输入密码的;

fe347af85307441da6b373e1cbb9242b.png

 sudo 指令

 对一条指令进行提权。

如果我们当前是一个普通用户,但是需要权限来使用 一行命令,又不想切换到 root 用户之下来进行操作,那么我们就可以使用 sudo 指令来实现。

语法:

sudo 需提权指令

e060514965744552a4e7ca8814edc8db.png

 有上图,我们可以发现,我们输入的是当前普通用户的密码,当我们输入之后,我们发现我们的权限就是 root 了,而且,在接下来的一段时间内,我们再次接下 sudo 的时候就不用在输入密码了(时间的多少根据系统不同有差别)。

 相信看到这里的读者一定有一个疑问,为什么使用 sudo 的时候,我们输入自己普通用户的密码就可以是使用 root 的权限了,这是不是有点扯。

 其实,如果我们马上使用 adduser 新建一个普通用户,那么这个普通用户是没有办法使用 sudo 指令的,因为此时系统默认是不信任这个用户的;只有在将来,将这个普通用户添加到系统的信任白名单当中,这样,这个用户才能够使用 sudo 指令。

 Linux权限管理

 简单来说 ,在 Linux 当中的一件事情是否能被人 而 做,这就是权限做的事情。而去权限其实认证的是 身份,权限和人有关;

权限 也和事物的 “属性” 有关,在Linux当中文件,有什么属性,比如 可读 , 可写 , 可执行等等的属性,这些也都和 权限有关。

我们可以 使用 ls -l 来查看 文件的属性:

我们发现,在文件的属性开头,有这么 由 10个字符组成的一串字符串:

2e51a407f4234f05a4469b8a4a10b7e7.png

 开头的 第一个 字符表示的是 文件类型

b0d6f90c0d824ae4b3000bd56be73739.png

 文件的类型

 我们在 windows 当中是通过文件名的后缀来 识别这个文件是一个什么文件;但是在 Linux 当中 文件的后缀名没有直接的意义,在 Linux 当中是通过 入下图所示的 第一个字符来表示 文件类型:

0cf6c611159545bd858ce64ec0f4c83e.png

 不同字符,代表的文件类型:

  • d:文件夹
  • -:普通文件
  • l:软链接(类似Windows的快捷方式)
  • b:块设备文件(例如硬盘、光驱等)磁盘文件,如下所示其实就是 磁盘,只不过在Linux当中一切皆是文件。

    b264670e1e3741578bf7e75a177b7696.png

  • p:管道文件  向下述例子就利用 管道文件进行 简单的转移。

    da31733f7c3e4ce0ae2ad9842a911961.png

  • c:字符设备文件(例如屏幕,键盘,显示器等串口设备)
  • s:套接口文件
     

 需要注意的是,假设我们写了一段 C 语言源代码,文件名叫 text.c ,当我们 使用 mv text.c text.txt 命令,把这个 文件名改为  text.txt 之后,我们发现,原本能用gcc跑过的 text.c ,修改名字为 text.txt 之后就不能跑了。这是因为 gcc 是一款编译器,是一个 能在 Linux 操作系统上运行的软件,那么这个软件是用 文件名后缀来识别这个文件是什么类型的文件的,所以它跑不过。

 针对上述的几种情况, Linux 在看待系统 当中的 文件名后缀时,是不管的,他只看属性当中的字符,所以不管文件是否有后缀,后缀是什么都是不管的。

文件的基本权限

 3342dafa2947462fa385800ffdfdb387.png

 后面的字符表示的意思:

  • 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
  • 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
  • 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
  • “—”表示不具有该项权限(对应的权限位置,没有权限)
     

 那么权限也是要看 “人” 的,比如,校长办公室能不能进,也是要看 “人” 的,那么 “人” 代表的不是 用户,而是 权限身份。

在 Linux 当中 有三种权限身份:

  • 拥有者:表示这个文件是属于 谁的
  • 所属组:假设在一个 Linux 系统当中 可以同时登录 10个用户,有 6 个用户组成了一个组,那么他们可以给 文件设置 一些 组级别的权限。
  • 其他人:表示这个文件不属于谁

 在一个文件当中就会有上述 三种 身份的权限规定。

 那么这里 三种身份和 之前我们说的 root 和 普通用户有什么区别吗?

其实 root 和 普通用户是 “人”,而且 上述的三种 只是 “人” 扮演的一种身份。也就是说,上述的 三种身份既可以是 root 来扮演,也可以是 普通用户来扮演,如下图所示关系:

a337911a04fa41c380c1b7befba64258.png

 所属组身份出现的原因:

举个例子,如果在一个公司当中,有两个工作室 都开发同一个项目,公司像利用这种 方式来实现竞争的目的,从而做出更好的作品。那么 两个工作室当中,假设 张三 和 李四 分别在不同的工作室当中。有一天 张三写了 一段它认为很好的 代码,不想被 李四看到,李四本就属于是 其他人,那么就可以把 其他人 这个身份权限设置为 “0”,这样 李四就 不能读 不能写 不想运行这个文件了。但是如果张三工作室当中 有一个人 ,假设叫 王五,他想看张三写的代码,但是王五属于是 其他人的身份。那么王五就不能看到 张三写的代码,如果把其他人 身份的权限打开,李四就会看到代码,这就矛盾了。

那么为了实现上述的效果,就多设计了一个身份,叫做 所属组,把这个身份 的权限打开,让王五加入 所属组,那么王五就可以看到代码了。

那么在刚才 10个字符表示的文件属性当中,我们说了第一个字符表示的是 文件的类型,那么后面 9 个其实就是 表示的是 该文件 那三个权限身份 所对应 权限属性

351183b4adae449f96e38811775c9473.png

 上述的10个字符,除了 第一个字符表示的是文件的类型,后面的 9 个字符,3个 3个 为一组,从左向右 分别表示的是 拥有者  所属组  其他人 这个三种身份的  r-读权限  w-写权限 x-执行权限

 也就是说,在权限的三个位置表示上,每一个位置的权限都是固定的,什么位置是什么含义是固定的,而且每一个位置只有 是 或 否 ,具有指定的权限:

88a067f147594794987361702ba1b940.png

18effaf5f1e2494fba07578a3227c497.png

 e3ed042fd7ce42ffbabc5d90a9460e1b.png

 像上述的 test.txt 文件,如果我以 whb 也就是 拥有人的权限来访问的话,我们就有 写 和 读的权限,但是没有执行文件的权限。

 比如,现在我们以 一个 不能读,写,执行文件的身份去访问一个文件:

a9548e6156ce40629fb313f764ed5c38.png

 提示 Permission denied

 我们发现他会提示我,不能访问这个文件。

但是,我们知道 root 是不受权限约束的,也就是说,就算 root 是一个不不能读,不能写,不能执行的身份,他也可以实现 读写等等的操作,因为 root 用户不受权限约束。 

 如下图所示表示的是 这个文件的拥有者:

626bd6ab6881473682a1d60c8ab8d02a.png

 如下图所示,表示的是,这个文件 的所属组是哪一个:

098393ba23554d48a56aac090152131d.png

 像上图当中的所属组,因为这个文件就只是自己再用,所以这个文件的所属组就以 当前的用户名在名了,当前用户就是这个组的组长。

如下图表示的是,这个文件的大小(单位是字节):

593bd6c4c818409281fd3c1581650fd2.png

 如下图表示的是,这个文件最近一次修改的时间:

77d256eaf2db4c45aa81c84a0c8ff8a2.png

 假设我们以 root 的身份访问 上述的 的 test.txt 这个文件,那么Linux会进行身份的对比,如果不是拥有者,也不是所属组,那么就是  其他人。其实在判断的时候 就是 一个 if () else if () else  的逻辑,因为 其他人 这个身份太多了,不能穷举。

 权限的修改

 使用 chmod u g o 的方式 修改

当我们 创建一个文件之后,我们可以使用 一下命令来对 文件当中权限进行修改:

chmod u-rwx,g-rwx,o-rwx 文件名

 上述的 u g o 三个字母分别代表的意思是 : 拥有者 所属组 其他人。

这样就可以把 text.txt 这个文件当中,拥有者,所属组,其他人的所有权限都关闭。

e2a68ccb0fcf4b08ad07d069520d56ba.png

 使用一下方式来 对某一个 身份添加一个权限:

chmod u+r test.txt

拥有者增加一个 读的属性。

bbee6b8ed8b649d59c36ee763868fa24.png

  如下:给拥有者去掉 读的权限。

chmod u-r test.txt

 上述就是修改权限的例子。

用8进制来进行修改

 我们知道,对于上述权限,每一个位置就代表一个权限,而且只有是 或 否两种表达形式,那么我们就可以想用 用 1 或 0 来表示 是 或 否。比如 rwx 表示为 二进制的 111 ,计算出结果就是 7;rw- 表示为 110 ,计算出结果就是 6,我们发现每一位上的权限可以 对应为8进制的数字从 0 - 7。

那么我们还可以用 chmod 这样写:

 把 拥有者 所属组 其他人 的权限都关闭,这里有三个 0 ,每一个 0  代表的是 三个对应关系的 而二进制表达式所计算出的 8 进制结果。

chmod 000 test.txt

058421686c004e2bb5a7e50066f4883b.png

 修改 文件的 权限身份

 可以使用 如下方式把 文件的拥有者 身份给某一个用户:

chown 用户名 文件名

 但是,这种操作如果我们直接使用的话吗,应该会报 Permission not permitted 你没有这个权限的错误。

因为我们要给文件的话,需要对方的同意。

如果对方不统一我们也可以使用 sudo 来强制执行。

当我们使用 root 用户给文件拥有者权限的时候,就不需要对方同意了。

b1ef67b13f8c49fb8dee5365f458c07d.png

可以使用如下的方式把 文件的所属组 给其他:

chgrp 所属组名 文件名

6eb102adf14a437da186a7de6711756a.png

 如上所示,就把 所属组给gaobo 这个用户了。

同样 chgrp 和 chmod 一样是需要对方同意的,如果不同意可以使用 sugo 的方式强制给出,或者直接使用 root 账号直接跳过这个权限直接强制给出。

 我们还可以一次就把 文件的拥有者和 所属组都进行修改:

chown 拥有者名:所属组名 文件名

 如上述,我们把test.txt 文件的拥有者和 所属组 都修改为了 gaobo 那么我们现在就可以一次性把两个权限身份都修改为 whb:

b86ded39dd0a48f8b79f06d6c628a204.png

其他注意的点

那么能修改权限的只能是 两种人,一种是文件的拥有者,另一种就是不受权限约束的 root 用户。

 关于权限的三个问题

 权限身份的认证

3ea443a0567a469384c7868f34ede541.png

 如上述情况, whb 是我当前的用户名,那么我即是 文件的拥有者,又是所属组,那么我们当然可以进行 读的操作,但是写的操作 我能不能做呢?

答:不能写。

37f8ba7324bf4e54b9bc8e4a734f0942.png

 如果当前用户在 文件当中有多个文件权限身份的时候,只能选择一个身份进行验证,按照从左到有的顺序,如果前面的身份已经被选择了,那么即使后面有可以穿戴的身份Linux也不会管了。

如上述例子,我们把 这个文件的拥有者改成其他人,那么我们就会被认为是 所属组,那么我们就可以进行写的操作。

 文件默认权限

 如下,是我们新创建的 两个普通文件和 两个目录。

8aab3ccbe8994d2c85855906812817c1.png

 这里就有一个问题,为什么我们新创建的普通文件,和是目录,他的文件权限身份的默认访问权限,回事上述一样的设置:

为什么普通文件是 :664

为什么目录文件是 :775

        我们先来了解一下LInux当中给文件的默认权限值:

  • 默认给普通文件的起始权限是666;
  • 默认给目录的其实权限是777;

 但是我们上述的普通文件和目录的默认的权限却不是 666 和 777 。

这是因为,在 Linux 当中有一个叫 权限掩码(umask)的东西:

f39477d6295a41cc9abe468264dfd6a3.png

 凡是在 uamsk 当中出现的权限,不会在最终的文件权限中出现。

 umask 就像是 筛子一样,显示拿到这个文件的默认权限,然后通过某种计算,把 umask 当中有的权限 从默认权限当中去掉,最后得到的才是像上述一样的 权限。

 而像上述当中的 umack 他是 0002 ,其实他就是一个 8 进制的数,第一位可以看做是 代表 8 进制的符号,所以它的值其实就是 002 ,例如上述的普通文件 的默认权限是 666 ,那么二进制就是 : 111 111 111 ,umack 二进制数就是 000 000 010 :

d3d500be89a84b7f8788b7bcbe006da6.png

 那么在 uamsk 当中出现过的权限,就不应该在 其实权限当中出现了。根据上图,我们得出了 起始权限的最终值: 110 110 100 ,转换成 8 进制就是 664。

 那么同样,对于 目录也是一样的:

aa2547724a3c471b8c0846eea2be3075.png

这里的计算方法其实就是单纯的 没在 umack 当中出现的权限在,默认的权限当中就不会出现,umack 出现的权限,如果在 默认权限当中本来就没有,那么就没有,如下所示:

b20008a4d52648b29f9d31c486eca416.png

 其实逻辑上,他是按照下述 的公式来进行 计算的:

最终权限 = 起始权限&(~umask)

我们可以采用以下命令来 修改 umask 的值:

umack xxxx  (其中 xxx 代表 umask 的值)

Linux 当中的目录 的 读 写 执行 代表什么(目录的权限)

 我们都知道,在Linux当中一切皆是文件,那么 目录 也是一个文件,它的 读 写 执行 操作是怎样的呢?

如下例子:

a4e71ff927e94b32ac4f85530184b991.png

 我们首先是 把 dir 这个目录的 所有人的 读 的权限都 删除掉,然后,我们使用 cd  来进入 这个目录,我们发现可以进入,但是我们使用  ls 来查看这个目录当中的文件的时候,就不能 查看,提示   Permission denied;没有权限。

那么我们就发现:

目录的 读 权限 不是阻止用户进入目录的权限,而是 阻止用户查看目录当中的文件列表的权限。

 再如下例子:

cbfb7907f44345e2a9baa8733392a24d.png

 我们进入先把这个目录的  写 权限删除了,然后我们进入这个目录,发现是能进入的,然后我们使用 touch 想创建创建一个 txt 的文件,发现还是 报错: Permission denied;没有权限。

目录的 写 权限,控制用户 是否能在当前目录下进行    创建,更改,删除文件的操作。

但是上述当中的删除操作,有点不一样,我们在下一个小标题(目录权限)当中进行讲解。 

 目录的 执行 权限,控制用户是否能 进入  该目录。

7201eefcf2af4c0a8d381fe9ad1c1339.png

 如上述例子,把目录的 权限改为 可读可写,不可执行,我们 cd  dir  ,发现报错了。

 我们这里来查看一些 Linux 当中用户 home 目录的 权限:
 

c51b17dcd020403ab6988002b87d799f.png

 我们发现,上述当中的 每一个用户的家目录的权限都是 700 ;也就是说  只有 这个目录的拥有者 才有 读写执行权限,而 其他所属组 , 其他人 的都是没有任何权限的。

 那么,Linux 当中的用户是肯定需要 进行 文件的交互的,所以当我们 想 跟 其他用户 进行交互的时候,我们需要在根目录下,创建 一个 文件夹,再在这个文件夹当中,放入我们想要共享的文件,然后设置这个文件夹的 访问权限。

现在,假设我把上述当中 用于共享的文件夹的权限都是打开的,但是,我们惊奇的发现,其他用户竟然能够 删除 我用于共享的这个目录当中的 这个普通用户没有任何权限的文件!!

d1fb7261576345d4b6a61b270451a703.png

 比如上述例子,我们使用 gaobo 这个用户,删除掉了 whb 用户创建的 共享目录当中的文件,而且这个文件, gaobo 是没有权限 进行 读写 和执行的。

 其实,在Linux 当中 一个文件是否能被 用户删除,不是这个文件所决定的,而是由 这个文件所在目录 决定的。

 如果我们把这个共享目录 的 w (写)权限 去掉了,那么其中的文件,其他的 用户就不能进行 删除操作了。

 但是,上述提到了 去除 w(写)这个权限,但是这个目录又是一个 共享文件,其他用户怎么,往这个目录当中创建 文件呢?

 所以,我们使用上述,修改 共享目录 的权限,使得 其他用户不能删除目录当中 的 文件是不可取的。

我们查看 根目录 的权限,发现 other 是不能写的 ,只能读:

3a8fc26c5585439691afbc23386b9d30.png 

 那么也就是说,普通用户 一般是不能在 根目录下 创建共享目录的,只能由 root 用户创建,那么对于 root 用户创建的共享目录,那么所有的用户都属于是 other  。其实也没有必要创建共享目录,我们ls 查看 根目录,发现有一个 tmp  的目录,这个目录是唯一一个 在 根目录下 带 t (粘滞位) 的目录。

粘滞位

 为了解决 上述的关于 共享文件的一些 问题,我们引入了 粘滞位这个概念,这个一般是给目录设置的,设置之后,大家可以在这个目录当中进行 增 改 查;只允许 文件拥有者或者是 root 用户 类删除这个文件,其他人一概不允许。

t 是 一种 特殊的 x  权限,例子如下:

626d3c79f3a8404b928b87f000b7d6b8.png

 如上述,给 共享目录当中的 other ,加一个 粘滞位。

当我们给 这个共享目录 的 other 设置 粘滞位 之后,向上述 当中的 gaobo 用户删除 whb 用户创建的文件就不行了:

4988354cc9554767afa5050f1ada21bb.png

猜你喜欢

转载自blog.csdn.net/chihiro1122/article/details/130734597