文章目录
前言
一、Linux权限的概念
☘️1.Linux下的两种用户
☘️2.如何创建一个普通用户
☘️3.如何删除一个用户
二、Linux权限管理
☘️1.什么是权限
☘️2.文件类型和访问权限(事物属性)
☘️3.文件权限值的表示方法
☘️4.汇总图
☘️5.文件访问权限的相关设置方法
三、几个常见且十分重要的权限问题
☘️1.目录权限
☘️2.umask
☘️3.粘滞位
四、复习与回顾
总结
大家好啊,我是不一样的烟火a,这篇文章我为大家总结了Linux权限的所有重点知识,并在文章中添加了几个常考面试题进行补充,对初学者十分友好,让大家从0到1彻底了解Linux权限。相信看完的小伙伴都会收获满满,如果一时看不完,建议大家先收藏起来以后再看。那么废话不多说,开始我们今天的内容。
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户(root):只有一个,具有Linux下最高权限,一般不受权限约束。(其实Linux下的root用户就相当于管理员,与Windows下的管理员类似)
- 普通用户:可以有多个,受到权限的约束,在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
得出结论:
- Linux下可以同时存在多个用户,所以Linux是一个多用户操作系统,也就是说一个系统可以被多个用户使用。
- 那么Windows是不是一个多用户操作系统呢?答案为:是的。这时可能有人问,为什么我的Windows从来没有被别人用过,这是因为这个电脑是你的呀,如果你愿意,你也可以在你的Windows下创建多个用户。
- 我们在root与普通用户之间来回切换时,其实潜台词就是切换我当前权限
如何切换用户:
whoami命令查看当前用户:
命令:whoami
举例:
大家可以发现我现在是普通用户,下面教大家如何切换用户
切换用户:
命令:su [用户名]
功能:切换用户。
例如:要从root用户切换到普通用户user,则使用 su user。要从普通用户user切换到root用户则使用 su root(root可以省略),也可以使用su - 切换到root,此时系统会提示输入root用户的密码。
举例:
普通用户切换到root用户。
使用su - 切换到root用户。(注意观察细节哦)
使用 su - 切换到root用户,就相当于重新登录了一次root,直接回到家目录下。使用其他方式切换到root用户还会停留在当前位置。并且使用su - 切换到root用户还可以看到最近一次登录root用户的时间。
root用户切换到普通用户。(root用户切换到普通用户则不用输入密码)
如何快速切换到上一个用户:(如果上一个用户是root用户,你也可以快速切换到root用户)
使用 ctrl + d 可以快速切换到上一个用户。
举例:
普通用户切换到普通用户。
总结:
- 普通用户切换到root用户 和 普通用户切换到普通用户 需要输入对方的密码。
- root用户切换到普通用户不需要输入密码。
新建用户:
命令:useradd name
设置新用户密码:
命令:passwd name
注意:只有root才有权限创建一个普通用户。
举例:
查看是否创建成功:
我们进入家目录查看我们创建的用户是否存在。
我们发现家目录中已经存在我们创建的用户,我们再换成其他普通用户登录试试。
发现登录成功,这时就证明创建用户成功。
删除用户:
命令:userdel -r
注意:
在删除用户的时候一定要带-r选项,如果只用userdel命令去删除用户的话,并不能删除该用户的所有信息,只是删除了 /etc/passwd、/etc/shadow、/etc/group/、/etc/gshadow 这四个文件里的该账户和组的信息。默认情况下创建一个用户账号,会创建一个家目录和一个用户邮箱(在/var/spool/mail目录以用户名命名)
举例:
只用 userdel命令 删除用户的情况。
上图报错,所以当你再次创建该用户账号的时候会报错,这就说明与该用户相关的文件或目录之前并没有删除完全。
用 userdel -r命令 删除用户的情况。
我们用 userdel -r命令 就可以把用户彻底删除了,并且可以再次创建同名的用户。
总结+额外补充:
userdel [用户名] 只删除用户,不删除用户的家目录。
userdel -r [用户名] 删除用户和用户的家目录。
userdel -f [用户名] 强制删除用户,即使用户当前正在登陆状态。
userdel -rf [用户名] 强制删除用户,同时删除用户的家目录
我们上面讲了这么多,其实都还没有讲解权限到底是什么,那么权限到底是什么呢?
我们先来举几个个例子:
例1:假如你喜欢追剧,这时你正在腾讯视频上面看电视剧,正当你看到精彩的时候,发现下一集看不起了,电脑上弹出需要开通vip方可继续观看。这就是因为你没有vip权限才不能继续观看。
例2:你能否在一片面包上打王者荣耀,你能否用马桶煮饭,你能否在一本书上看电影,如果你能,我愿称你为最强。
所以我们根据上面两个例子可以得出结论:
- 人:权限主要是用来针对人的,权限是在允许一些人的同时并拒绝一些人。
- 事物属性:事物的基本属性决定权限相关的概念。例如:如果一个文件本身没有这个属性,那么人就不可能在这个文件上有这种属性相关的权限。
- 简而言之权限就是一件事情是否允许被你 “做” 。
- 权限的核心 = 人 + 事物属性(由于Linux下一切皆文件,所以这里是事物属性就对应文件是否能被 读、写、执行)
如何查看文件类型以及相关属性和权限:
命令:ll 或者:ls -l
我们通过上面的命令查看当前目录下所有文件。
下面我们介绍每个方框里面的内容都代表什么。
方框2:方框2中的数字表示连接数,具体讲解会比较麻烦,所以后面我会单独写一篇文章来讲解。
方框4:表示文件或目录的大小。
方框5:表示文件最近被修改的时间。
方框6:表示文件名。
方框1:
方框1里面的第一列字符代表该文件的文件类型。(这里补充:Linux不像Windows,在Linux下,不以文件的后缀来区分文件类型。)
举例:
我们先写一个程序。
然后我们将写的程序编译一下,形成可执行文件。
我们运行一下形成的可执行文件(a.out)
我们再更改一下可执行文件的名字,看看能否运行。
我们不断更改可执行文件的名字,发现这个文件依然可以被执行,所以可以证明Linux下,不以文件的后缀来区分文件类型。
总结:
Linux下,不以文件后缀来区分文件类型,没写后缀不代表不可以使用。而我们给文件名添加后缀的主要原因是方便给自己看,而在操作系统层面上并没有意义。
额外补充:
如果我们将我们写的 .c文件 改成 .txt文件 再去用gcc编译,又会出现不同的现象。
这时我们发现gcc给出警告:文件无法识别(File format not recognized)。为什么这里会警告呢,刚刚不是说Linux下,不以文件后缀来区分文件类型吗?这是因为Linux下是操作系统不以文件后缀来区分文件,而gcc是Linux环境下的一个软件,gcc 不等于 Linux系统,在gcc中gcc会以文件的后缀来区分文件,所以这里编译就会给出警告。
各个字符代表的文件类型:
d 目录文件(文件夹) - 普通文件 l 软链接(类似Windows的快捷方式) b 块设备文件(例如硬盘、光驱等) p 管道文件 c 字符设备文件(例如屏幕等串口设备) s 套接口文件 举例:
d 目录文件(文件夹):
就是目录, 能用 cd 命令进入的。
例如:
- 普通文件:
Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件。
例如:
虽然这里的a和a.out是可执行文件,pro.tgz是压缩文件,但它们都属于普通文件。
p 管道文件:
我们用mkfifo命令创建的文件就叫做管道文件,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。(主要用于通信)
b 块设备文件:
就是存储数据以供系统存取的接口设备,例如:硬盘、光驱等。
如果你使用的是云服务器,那么可以用下面命令查看到自己的磁盘:
命令:ls -al /dev/vda1
用下面命令还可以查看你的磁盘当前的情况:
命令:df -h
c 字符设备文件:
即串行端口的接口设备,例如:键盘、屏幕等串口设备。
用下面命令查看到自己的终端设备:
命令:ls -l /dev/tty
l 链接文件:
类似Windows的快捷方式。
例如:
命令:ln -s a a.link
我们通过链接文件依旧可以执行a文件,就像Windows的快捷方式一样。
s 套接口文件
这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。
讲完第一个方框里面的第一列字符后,下面来讲解剩下九列字符都代表什么。
在这之前我们先来讲一下文件访问者(可以认为是一种角色或身份)的分类(人)
- 文件和文件目录的所有者:文件属于谁,用u表示,u---User
- 文件和文件目录的所有者所在的组的用户:文件属于哪个组,用g表示,g---Group(就假如说你的上司就是文件拥有者,而你是新来的实习生,那么你的上司就可以把你拉到他的组里面去)
- 其它用户:不属于上面两个任何一个,用o表示,o---Others
方框3:
相信细心的小伙伴已经发现,其实方框3里面的内容就表示文件的拥有者和所属组,其中第一个字符串就代表文件的拥有者,第二个字符串就代表文件的所属组。
所属组存在的意义:
先讲个小故事,假如你在一家公司里面上班,但是这家公司很穷,只有一台服务器,而公司里面又有两个竞争小组,你就在其中的一个小组中,有一天你写了一个超级牛逼的代码,而你小组的组长想看一看你写的代码,这时你的组长其实就属于other(其他用户),是看不了你写的代码的,如果你把other的权限都放开,这时就会导致一个严重问题,另一个小组的所有成员也是other,只要你把权限都放开,那么其他小组的人也能看到你写的代码。Linux为了解决这个问题,于是就引入了所属组,你只要把你所属组的权限放开,就能让自己组的人看到自己写的代码,又避免了被其他小组的人(other)看到。
例如:
这里的xjm就是文件拥有者,xjm又在文件拥有者的组里面。
经过上面的这些铺垫,我们现在就可以来讲解 方框1 中剩下九列字符都代表什么。
我们把剩下的九列字符分成三个字符为一组的字符串,第一组就表示文件拥有者的权限, 第二组表示所属组的权限,第三组表示other(其他用户)的权限。
基本权限:
- 读权限(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。
- 写权限(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限。
- 执行权限(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。
- “-”:表示不具有该项权限。
注意:表示读、写、执行权限的字符位置是固定的,每组的第一个字符永远代表是否有读权限,第二个字符永远代表是否有写权限,第三个字符永远代表是否有执行权限。
1.字符表示方法
Linux表示 说明 Linux表示 说明 r-- 只读 -w- 仅可写 --x 仅可执行 rw- 可读可写 -wx 可写可执行 r-x 可读可执行 rwx 可读可写可执行 --- 无权限 2.八进制数值表示方法:
权限符号(读、写、执行) 八进制 二进制 r 4 100 w 2 010 x 1 001 rw 6 110 rx 5 101 wx 3 011 rwx 7 111 --- 0 000 就以这里的a.out文件举例:
文件拥有者和所属组用户,拥有读、写、执行权限;其他用户(other)拥有读权限、执行权限,但是没有写权限。
命令1:chmod(change mode)
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
提示:只有文件的拥有者和root才可以改变文件的权限。
chmod命令修改权限值的格式:
第一种修改权限方式:用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限。
- -:向权限范围取消权限代号所表示的权限。
- =:向权限范围赋予权限代号所表示的权限。
权限字符:
- 读:r
- 写:w
- 执行:x
用户表示符:
- u:拥有者。
- g:拥有者同组用。
- o:其它用户。
- a:所有用户。
举例:
文件的初始状态(我们这里就拿test.c这一个文件举例):
1.我们让test.c文件的拥有者拥有对test.c文件的执行权限。
2.我们让test.c文件的所属组用户拥有对test.c文件的执行权限。
3.我们让其他用户拥有对test.c文件的写权限和执行权限。
4.我们让所有用户都没有对test.c文件的读权限。
5.我们让所有用户都没有对test.c文件的写权限和执行权限。
6.这时我们发现所有用户对test.c文件的所有权限都没有了,我们这时再去读、写、执行会发生什么呢?
我们发现,就算是该文件的拥有者,如果没有相对应的权限,那么就不能执行与该权限的相关所有命令。(这就好比,你小时候过年会得到很多压岁钱,但是结果被你父母收走了,这个钱本来是你的,但是你没有用它的权限,所以你用不了它)
7.下面我们再切换到root用户试试,看会出现什么情况。
8. 我们切换到root后,发现依然是所有用户都没有对test.c文件的任何权限。那么下面见证奇迹的时候来了。
我们发现root用户没有对应权限依然可以对test.c文件进行读和写。
9.我们再看看root能否更改test.c文件的权限。
噢,我的上帝啊!root居然能无视权限进行读写,并且还能更改文件的权限,这还有没有道理了。这时root就会走过来说,其实我就是上帝,我当然不用受权限的约束,而权限是用来约束你们这些凡人的,哈哈哈。
总结:只有普通用户会受权限约束,root是不受权限约束的。
第二种修改权限方式:用三位8进制数字。
由于读、写、执行权限的字符位置是固定的,所以rwx位置要么有相应字符,要么就是“-”(表示没有),所以我们可以用1表示该位置有相应权限,用0代表该位置没有权限。rwx就代表所有权限都有,那么就可以用二进制111(八进制为7)表示,然后我们就可以把二进制转化成八进制来表示每个用户所拥有的权限(在上面有个表格,里面列出了所有情况)
例如:
八进制的711,就表示拥有者拥有该文件的所有权限,所属组和其他用户只有执行权限。
举例:
还是拿test.c文件举例,下面是该文件的初始状态。
1.加上所有用户在test.c文件上的所有权限
2.取消所有用户在test.c文件上的所有权限
3.让拥有者和所属组在test.c文件上可以读、写,但不能执行;让其他用户只能读。
总结:修改文件的属性有两种方法:一种是ugo+-方式,另一种是八进制方案,至于用哪种,全看个人喜好。
我们前面说过 权限的核心 = 人 + 事物属性,上面已经讲完了属性(也就是文件的rwx权限),下面我们介绍一下 人(也就是更改文件的拥有者和所属组)。
命令2:chown(change owner)
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
命令3:chgrp(change group)
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
我们在更改文件拥有者之前,先问大家一个问题:在我们生活中,如果有人给你一件东西,需不需要经过你同意,如果别人给你的是100w,那你一定会毫不犹豫的答应;但是如果别人给你的是一口锅呢,你还会答应吗?答案肯定是不会的。所以我们在更改文件的拥有者的时候,需要征求别人的同意,看看别人是否接受这个文件。
举例:
test.c文件本来是用户xjm的,我们想把这个文件给用户xsm,但是xsm这时还没有同意,所以操作系统会警告说,这个操作是不被允许的(Operation not permitted)
如何让一个用户同意接受,另一个用户给的文件?
想让这个用户同意还不简单吗,我们可以学学杰哥是怎么做的。如果一个用户不同意,我们可以强迫他同意。我们只用把用户切换到root即可,root这时就会说:我可是上帝啊,上帝给的东西你能不接受吗?
举例:
方法1:
test.c文件的初始状态。
1.我们把用户切换到root。
2.修改文件的拥有者。
3.修改文件的所属组。
方法2:
我们其实也可以不用切换到root用户,然后更改再去更改文件的拥有者和所属组。我们只需要在在你的命令前面加一个sudo就可以了,他表示的意思是后面的命令将以root权限级别来执行,当然sudo只有当前行有效,后面如果还想用root权限就必须再加sudo。当然也不是每个普通用户都能用sudo的,只有被root添加到信任列表里面的人才可以用sudo,因为root也怕你拿着他的权限去到处瞎搞。(当然我们后面会将如何将用户列入信任列表)
举例:
现在我们把test.c文件的拥有者和所属组重新还给用户xjm,但这次我们用xjm这个用户。
1.修改文件的拥有者。
2.修改文件的所属组。
也可以直接用下面命令,将文件的拥有者和所属组一起修改:
命令:sudo chown [目标拥有者]:[目标所属组] [文件]
例如:
1.将root设置为test.c文件的拥有者,xsm为所属组用户。
2.将test.c文件的拥有者和所属组重新设置为xjm用户。
总结:修改人可以用chown命令和chgrp命令,如果要更改文件的拥有者和所属组,需要用sudo提升权限或者用root用户去更改。
额外补充:
上面说了这么多,为什么没有将用户改成other的命令呢?这是因为,只要更改了文件的拥有者和所属组,那么other也自然跟着变化了,所以Linux并不需要提供这样的命令。
请听题:进入一个目录,需要什么权限?(选择:r、w、x)
究竟答案是什么呢?下面我们来验证一下。
1.我们先创建一个名为dir的目录。
2.然后将其所有权限去掉。(这里不要忘了第一个字符是代表文件类型哦)
3.一一验证,找出最终结果。
目录只有读(r)权限的情况:进不去
目录只有写(w)权限的情况:进不去
目录只有执行(x)权限的情况:能进去
注意:如果一个用户既是拥有者也是所属组,那么就只看拥有者的权限,不看所属组的权限,因为权限只会被认证一次,只有你不是拥有者的情况下才会去看你是不是所属组。
例如:如果你既是文件的拥有者,又是文件的所属组,如果你拥有者没有任何权限,而所属组什么权限都有,但是你依然什么权限都没有,因为权限只被认证一次,已经认定你是拥有者了,所以你就只能有拥有者的权限。
总结:经过上面的实验,得出结论,进入一个目录,需要执行权限(x)。
问题2:读权限(r)又限制了目录的什么呢?
实验:
1.我们让dir目录的拥有者只有执行权限。
2.进入dir目录,并使用ls命令。
总结:读权限(r)限制了用户查看目录下的文件。
问题3:写权限(w)又限制了目录的什么呢?
实验:
1.我们给拥有者加上dir目录的读权限和执行权限。
2.我们进入dir目录,并试试在该目录下创建一个文件。
总结:写权限(w)会限制用户在该目录创建文件或目录。
整理一下:
- 进入一个目录需要执行权限(x)
- 查看目录下的文件列表需要读权限(r)
- 在目录下创建文件或目录需要写权限(w)
- 所以很多新目录被创建后,一般都会默认带上rwx权限,因为少一个权限都会影响操作。
umask命令:
功能:查看或修改文件掩码。
格式:umask 权限值。
Linux默认:
- 一个目录被创建,起始权限是从:777开始
- 一个普通文件被创建,起始权限是从:666开始
- 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到文件掩码(umask)的影响。假设默认权限是mask,默认文件掩码是umask。则实际创建的出来的文件权限是: mask & (~umask)(这里的&表示按位与,~表示按位取反)
说明:
- 将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。
- 超级用户默认掩码值为0022,普通用户默认为0002。
例1:
我们用普通用户创建了3个目录和3个文件。
我们发现,新建的目录和文件的实际起始权限是775和664。
分析:
- 一个目录被创建,起始权限是从:777开始
- 一个普通文件被创建,起始权限是从:666开始
- 我们当前是普通用户,所以文件掩码(umask)为:0002
- 实际创建的出来的文件权限公式为: mask & (~umask)
提示:用公式计算文件实际的起始权限前,需要先将起始权限和文件掩码都转化为二进制,并且文件掩码我们只用看后面三位即可,第一位可以不用管,几乎用不上。
所以我们由公式得:
- 目录的实际初始权限为:775
- 文件的实际初始权限为:664
以下为详细过程:
- 目录的起始权限为:777 --> 转化为二进制为:111 111 111
- 文件的起始权限为:666 --> 转化为二进制为:110 110 110
普通用户默认的文件掩码为:
- 002 --> 转化为二进制为:000 000 010
- 则 ~umask = 111 111 101
所以由公式:mask & (~umask)得:
- 目录的实际初始权限为:111 111 101 --> 转化为八进制为: 775
- 文件的实际初始权限为:110 110 100 --> 转化为八进制为: 664
例2:
我们用root用户创建了3个目录和3个文件。
我们发现,由root用户新建的目录和文件的实际起始权限是755和644。因为超级用户(root)的默认掩码值为022,大家可以自己去验证一下,上面我已经演示过一次了,这里就不重复演示了。
查看当前用户的默认掩码:
直接umask即可:
命令:umask
举例:
我们可以查看到root用户的默认掩码为0022(当然这里的第一位基本没用,我们用的是后面三位掩码)
修改当前用户的默认掩码:
命令:umask [目标掩码]
举例:
前言:
根据我们上面讲的目录权限,只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限. 这好像不太科学啊, 我root(上帝)创建的一个文件, 凭什么可以被你张三(法外狂徒)删掉? 我们用下面的过程印证一下。
我们用root用户在dir目录下创建一个文件(dir目录是用户xjm的)
由于dir目录就是用户xjm的,所以xjm有权利对目录下的文件进行创建或删除,我们来试试能否把root创建的文件给删除。
我们发现root创建的文件被删除了,因为xjm用户拥有目录的写权限。
由于我们在公司中工作时,有可能会存在很多用户同时在一个目录下进行编写文件的时候,并且他们都拥有该目录的写权限,但是这样就会发生一个问题,有可能一个用户一不小心把另一个用户的文件给删了。所以为了解决这个不科学的问题, Linux引入了粘滞位的概念。
粘滞位:
语法:chmod +t [需要设置粘滞位的目录]
功能:粘滞位能让所有用户在同一个目录下进行写入(创建文件),并且让其他用户删除不了你创建的文件,你也删除不了其他用户创建的文件,这样就避免了误删的问题。
注意:
- 当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
- 超级管理员删除(root)
- 该目录的所有者删除
- 该文件的所有者删除
举例:
1.我们用root用户创建一个名为mytmp的目录,并将其所有权限对所有用户开放。
2.给mytmp目录添加粘滞位。
我们添加完粘滞位后,这时该目录的other权限位置的执行权限x就变成了字符t,这就证明粘滞位设置成功了。
3.这时我们再用root用户在mytmp目录下创建一个文件,看看能否被其他用户删除。
4.这时我们再用某个用户在mytmp目录下删除其他用户的文件,就删除不了了,尽管你有mytmp目录的写权限。(这就是粘滞位的作用)
总结:
粘滞位主要用于:
- 当多个用户共享一个目录,且需要在该目录下,进行读写,并创建删除文件。
- 但是要保证只有自己能删除自己的文件,而别人不能删除。
注意:
- 粘滞位只能给目录设置,不能给普通文件设置,因为一个文件能否被删除,本身就是看用户是否有该文件所在目录的写权限,跟文件本身并没有关系。
- 一个目录的粘滞位一般是谁设置的,就只能是谁取消。(为什么说是一般呢,因为root不受权限约束,可以取消任何人设置的粘滞位,其他用户只能取消自己设置的粘滞位)
- 目录的可执行权限是表示你可否在目录下执行命令。
- 如果目录没有 -x 权限,则无法对目录执行任何命令,甚至无法 cd 进入目录, 即使目录仍然有 -r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
- 而如果目录具有 -x 权限,但没有 -r 权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行 ls 命令,但仍然没有权限读出目录下的文档。
额外补充:虽然root用户不受权限约束,但它也不是无所不能的。就比如说,如果一个用户正在访问一个文件,那么root即使有再高的权限都不能删除该文件,必须等用户访问完这个文件后,root才能删除。
到这里我们Linux权限的总结就结束了,相信大家一定能看懂,并收获满满。如果大家有什么解决不了的问题,欢迎大家评论区留言或者私信告诉我。如果感觉对自己有用的话,可以点个赞或关注鼓励一下博主,我会越做越好的,感谢各位的支持。