【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第1张图片

碎碎念:

本篇我们主要学习Linux权限的知识,你将会了解什么是用户,如何切换用户?什么是权限,有哪些基本权限,又如何切换权限?……。

在权限开始之前,我们先顺带介绍一下shell外壳程序。

目录

I. shell外壳程序

II. Linux权限的概念

用户

切换用户

切换用户路径

Ⅲ. Linux权限

权限

文件类型

用户身份

基本权限:读、写、执行、无权限

Ⅳ. 怎么改权限?

改文件的属性

chmod

没有权限会怎样

改人的权限

chown

chgrp

怎么强制改人的权限?

Ⅴ. 目录权限

进入一个目录需要什么权限?

目录的r、w、x权限

权限的悖论?

Ⅵ. umask

权限的初始值

umask

Ⅶ. 粘滞位

引入

粘滞位


I. shell外壳程序

我们是直接操作操作系统的吗?其实不然。

如果直接使用操作系统,那用起来,得牵扯到很多底层的细节,

专业性太强,并不适合广大用户。

我们访问操作系统,是直接与shell外壳程序进行交互的,shell再去和操作系统打交道。

shell外壳程序,在Win下是图形化界面,在Linux下就是指令

说一个帮助理解的小故事:你喜欢小花,但害羞不敢跟她讲话,所以你去找了媒婆。

这位媒婆姓王,我们叫她“王婆”。

王婆帮你说媒,把你的想法转达给她。

这样,你不用和小花直接打交道,而是通过王婆 间接实现了和小花的交流。

这里的”你“就是用户。

”小花“就是操作系统。

“媒婆”就是shell外壳程序。

shell:命令行解释器

将使用者的命令翻译给操作系统处理。

同时,将处理结果翻译给使用者。

shell是用户和操作系统交互的中间软件层,

方便用户的同时 也在一定程度上保护了操作系统。

然而,我们采用的命令行解释器不叫shell,叫bash

shell和bash的关系,就对应媒婆和王婆的关系。

shell 是外壳程序的统称,而bash是其中的一种。

II. Linux权限的概念

用户

Linux下有两种用户:

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

(root简直是上帝身份)

2.普通用户:在Linux下只能做有限的事情。

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

切换用户

那么怎样进行用户间的切换呢?

用命令su

root----->普通用户user: su user(这里的user是具体的用户名,如 jzy)

user----->root : su root(root可省略)

基于root用户的上帝身份,在root用户下,你想进哪个user都行,不用输密码✌。

而普通user之间进行su切换,是要输入用户密码的。

进root用户,要输root的密码。

这里强烈建议:root的密码和普通user的密码别设成一样的!

否则你在输密码时很容易脑袋晕晕,不知道自己在进哪个用户。

演示:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第2张图片

切换用户路径

不过,su [用户名] 的方式只能切换用户,

你的用户路径还是原来那个,并没有同步切换过来。

比如:我现在从root 切换到 普通用户jzy,想要建目录or文件,然而:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第3张图片  

发现都建不了!为什么呢?

原来,是因为我们su的命令只切换了用户,而路径还停留在原来的root下:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第4张图片

敲黑板!

su [用户名] 只会切换用户,而不会切换用户路径;

su - [用户名] 会在切换用户的同时,把用户路径也给切换掉。

现在,我们把su指令写成su - jzy,然后看看路径还是不是root了:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第5张图片

看最后一行,已成功切换到用户家目录下了。

补充:

如果我们用su从root切到普通用户身份,而路径没切,

那也可以用 cd ~ 的方式进入用户的家目录。

Ⅲ. Linux权限

权限

先来搞清楚一个问题:什么是权限?

在Linux中,权限是用来控制文件和目录访问的机制。

通俗而言,权限==人+事物属性

权限是针对人的;权限是由事物的属性决定的。

举个例子:b站里的视频,up主拥有删评的权限,而评论者就没有这条权限;

我们不能在教室游泳,因为教室的属性就决定了它压根没法游泳。

文件类型

我们可以使用 ls -l 来查看文件的权限。

我们先来看第一列。从第一列的第一个字符开始认起。

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第6张图片

要知道,在Linux下,是不以文件后缀来区分文件类型的。

但并不代表不可以使用,我们仍然可以加后缀。

给文件命名为test.c,虽然这对编译器而言,和test、test.txt没区别,

但是利于我们程序员辨别文件类型。

想知道文件类型,就用ll命令。ll显示出的第一个字符,表明该文件的类型。

文件类型包括:

d:文件夹

-:普通文件

l:软链接(类似Windows的快捷方式)

b:块设备文件(例如硬盘、光驱等)

p:管道文件

c:字符设备文件(例如屏幕等串口设备)

s:套接口文件

我们现在就只需掌握d和-,其余的以后会讲到。

补充:注意区分Linux和Linux下的软件!

gcc test.txt是编不过去的,因为gcc是Linux下的一款软件,

它不等于Linux系统,区分文件类型的机制也不一样。

用户身份

我们来学习第二列和第三列,它们表示用户身份,

分别是:文件的所有者和所属组。

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第7张图片

用户身份(人)分为三类:所有者(User)、所属组(Group)和其他用户(Others)。

所有者(u):文件属于谁

所属组(g):文件属于哪一组的

其他用户(o):只要不属于上面两种的,就是other

为什么要有所属组的概念呢?

讲个小故事:

一家公司里只有一台云服务器,而A、B两组要同时做同一个项目,

两组是竞争性质的,彼此的数据要保密,不能透露给对方。

这时,领导想看看A组小明的成果,要怎么办呢?

假如没有组的概念:小明是所有者,其它人都是other。小明要是放开权限给领导访问的话,

那B组的人肯定也能访问了。小明要是关闭权限,那领导和组员都看不了。

如果有了组的概念:想要谁看,就把谁拉近组里。组员能看,other看不了。

所以说,有了组的概念,我们能更灵活地配置权限。

你可能有点晕:刚刚不是学了root和user么,和这里的用户身份有啥区别?

这就好像,老师和学生是两种身份,而这两种身份由具体的人扮演。

这里的用户身份可认为是一种角色or身份,指特定的人对应的身份。

而root和user值具体的人,两者并不冲突。

user可以是所有者,也可以是所属组。

基本权限:读、写、执行、无权限

刚刚我们学习了:第一列的第1个字符是表示文件类型的,现在我们来学习后面9个。

每3个分成一组来看,每组对应着 不同的用户身份 具有的权限:

第一组是owner的基本权限,后面两组分别是group、other的。

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第8张图片  

什么是文件的基本权限呢?

4个基本权限:读(r)、写(w)、执行(x、execute)、无权限(-)。

1.读 :Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

2.写 :Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限

3.执行 :execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限

4.“—” 表示不具有该项权限

示例‍❄️:我们来读一下 上图最后一行的权限:

所有者可读可写;所属组只读;其他用户只读。

Ⅳ. 怎么改权限?

改权限包括两个方面:1.改变文件的所有者(人) 2.改文件的属性

改文件的属性

chmod

change the permissions mode of a file

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

格式:chmod (参数)权限 文件名

常用选项: -R 递归修改目录文件的权限

注:只有文件的拥有者和root身份才能改权限。

chmod命令权限值的两种格式:

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

用户表示符包括:

u:拥有者

g:拥有者同组用

o:其它用户

a:所有用户

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

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

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

例:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第9张图片

2.三位八进制数字

因为rwx的每位都是两种情况:可or不可。所以每位都可视为一个二进制位。

每个权限是3三个二进制位,即可视为1个八进制位。

eg:rwx为111,r-x为101

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第10张图片

实例:chmod 664 /home/abc.txt

没有权限会怎样

如果是root身份,那无所谓,root压根不受权限约束,

权限约束的是普通用户。

普通用户身份如果没有权限 -----> 报错,无法访问:Permission denied

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第11张图片

改人的权限

chown

change own

功能:修改文件的拥有者

格式:chown [参数] 用户名 文件名

如:

chown user1 f1

chown -R user1 filegroup1

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第12张图片  

chgrp

change group

功能:修改文件或目录的所属组

格式:chgrp [参数] 用户组名 文件名

常用选项:-R 递归修改文件或目录的所属组

如:

chgrp users /abc/f2

怎么强制改人的权限?

如果要给别人一样东西,我们是不能随心所欲、想给就给的,要征得对方的同意才行。

人的权限也是一样。

如果我们只是普通用户,那是改不了权限的:

只有当我们升级成上帝身份root,才能随心所欲地更改,无需对方同意。

那出了转成root身份强制改,有没有什么温柔一点的方法呢?

有的,用sudo命令提升权限

例:

(我们此时是普通用户whb)在chown命令前加上sodo就可以改了:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第13张图片

其实sudo本质还是强制改的:sudo的后续命令,将以root的身份执行。

也就是说,chown whb myfile.txt这条命令是以root执行,

但只是这一次执行,后面其他的命令还是以whb身份执行。

那离谱了:这么说,我们想强改权限的话,全都加个sudo不就好了?

其实不会,普通用户是没法执行sudo的,必须是root把你添加到信任列表里,你才能sudo。

Ⅴ. 目录权限

进入一个目录需要什么权限?

这个问题是常见的权限面试题。

我们来一一验证下r、w、x。

有r:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第14张图片  

这说明cd一个目录与r无关。

有w:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第15张图片  

这说明cd一个目录与w无关。

有x:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第16张图片  

成功进入!

所以,进入一个目录,必须得有x权限。

目录的r、w、x权限

查看目录下的文件列表 需要:r权限

要在目录下创建文件or目录 需要:w权限

进入目录 需要:x权限

敲黑板!

目录的可执行权限是表示你可否在目录下执行命令。

如果目录没有 -x 权限,则无法对目录执行任何命令

甚至无法cd 进入目, 即使目录仍然有-r 读权限。

所以说,有 r 也不一定能进入目录读取文件

这个地方很容易错

而如果目录有x 无 r,那用户可以执行命令,可以cd进入目录。

但由于没有r权限,所以即使可以执行ls命令,但仍然无法读取文档。

权限的悖论?

现在出现一种尴尬的情况:

作为所有者,你啥权限都没;作为所有组,你所有权限都有。

那到底听谁的呢?

示例:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第17张图片  

权限只被认证一次,只要你是所有者,那只看所有者的权限;

如果你不是所有者 但 是所属组,就只看所属组的权限

Ⅵ. umask

权限的初始值

Linux下,创建出一个文件或目录时,是有默认权限的。

目录的默认权限为777;

文件的默认权限为666.

但我们实际创建出来的目录,看到的权限并非777,而是775;

文件也并非666,而是664:

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第18张图片

可见,最终的权限并不等于默认权限!这是为什么呢?

umask

实际上,创建文件和目录时,还要受到umask的影响。

umask命令,用于设置新创建文件和目录的访问权限掩码

简单来说,我们最终的文件权限,是默认权限和umask共同作用的结果

假设默认权限是m,则实际创建的出来的文件权限是: m & (~umask)

即先将umask按位取反,再和m按位与。

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第19张图片

权限掩码是可以查看和改变的,umask指令的功能,就是查看或修改文件掩码 。

$ umask //查看

$ umask 044 //修改为044

root和普通用户的默认umask是不一样的:

超级用户默认掩码值为0022,普通用户默认为0002。

Ⅶ. 粘滞位

引入

Linux下,会存在共享目录,以便多个用户共享文件和资源,从而达到用户之间的协作。

比如,我们QQ群和钉钉群常用的协作文档。

大家在同一个目录下,进行读写、新建、删除等操作。

这样的目录,一般所有者和所属组都是root,其他人以other的身份操作。

那似乎有一个隐患:假如我写的文件被别人误删了怎么办?

毕竟,在目录当中,删除和新建一样,是不需要经过同意的,

也没有设限,这不同于r、w、x权限。

新建或删除文件,和文件本身的权限没有关系,而是跟 所处的目录 是否给了读写权限 有关。

所以默认情况下,共享目录的成员可以互删彼此的文件。

我们希望达到的是:在共享目录下,只能自己删自己的,而不是删掉别人的。

对此的解决方法是:将目录设置为”粘滞位“

粘滞位

chmod + t [目录]

说明:

1.粘滞位只能给目录设置,不能给文件设置。

2.我设置的粘滞位会被别人取消设置吗?

不会。一般是谁设置,谁取消。

3.粘滞位只能给other设置。

4.设置粘滞位以后,只能被这三种身份删除:

a. 超级管理员删除 b. 该目录的所有者删除 c. 该文件的所有者删除

这里的情况是基于共享目录,大家需要有读写的权限。 这时得用粘滞位。

如果不需要别人写入,那你不想自己的文件被别人删掉的话,只需把w权限去掉就可以。


好啦,本篇的知识点就讲到这里。现在,我们已经过了新手村,系统掌握了Linux的基本指令。

下节我们将学习如何在Linux下编程。

【Linux入门 · 下】Linux权限 用户 | chown | chmod | chgrp | 目录权限 | umask | 粘滞位 | shell_第20张图片

你可能感兴趣的:(linux)