写在前面
这篇文章,我们来聊一聊Linux下权限相关的知识,我打算从这几个方面展开:
认识Linux下用户的分类
什么叫做权限
没有权限会是什么样子
如何修改权限
其它重要的问题
那么废话不多说,我们现在开始。
1. Linux下用户的分类
Linux下有两种用户:
root(超级用户)
普通用户
我们adduser添加的就是普通用户。
他们有什么区别呢?
root 基本不受权限的约束,而普通用户受权限的约束。
如何切换用户
我们如何切换两个用户呢?
Linux下所有的用户都有自己的密码,
我们可以通过su/su- 指令切换用户:
例:(切换到root用户)
输入的密码是root的密码,
另外,su- 指令是切换到root的根目录下,su 还是在当前的目录下面。
我们可以用Ctrl d这个快捷键回到之前的用户:
当然,直接输入 exit 也是一样的效果。
如何提高用户权限
我们可以通过sudo指令可以临时提升用户的权限,(持续时间可能十几分钟不等)
例:
我们可以观察到,在指令前面加上sudo,用户就临时切换成了root
这里输入的密码是当前用户的密码,
你可能会问:为什么我输入我的用户密码却能获得root的用户权限?
实际上,我们需要将该用户添加到系统信任的白名单才能享受sudo指令,
至于如何添加,我会在讲Linux工具的时候介绍,如果有兴趣的话,可以自己上网搜教程。
2. 什么叫做权限
权限,其实就是一件事情 是否允许你去做。
权限的认证是身份还有事物的属性,我们拿一个文件举个例子:
比如说我们刚刚建立的test.txt文件和目录:
最前面的这个:
是代表文件的类型:
- 代表普通文件(文本、可执行文件等等)
d 代表目录文件
b 代表 块设备文件(磁盘文件)
c 代表字符设备文件(键盘、显示器)
p 代表管道文件(用来通信的)
我们这里主要讨论普通文件和目录文件。
补充:(文件类型)
Linux系统中的文件后缀名是没有直接意义的(系统内核不靠这个区别文件类型)
(注:只是系统内核,不代表Linux下的一些软件他不需要后缀名)
(比如说gcc编译器,他编译的时候还是需要你是.c的后缀名)
我们继续来看权限:
Linux中表示文件权限的是这个地方的字符,
他们三个为一组,分别代表拥有者,所属组,other的权限,
这些字符的意思分别是:
r 代表读权限
w 代表写权限
x 代表执行权限
- 代表没有这个位置的权限
另外:
文件的这两个地方分别代表的是该文件的拥有者和所属组。
3. 如果没有权限是什么样的
普通文件:
这里,我们重定向了一句话进test.txt文件中:
并查看了test.txt 文件的内容,
如果这个文件没有写权限会如何?
我们发现当该文件没有写权限的时候,我们的追加重定向就失败了
没有追加这句话进文件,Permission denied 了。
如果没有读权限呢?
我们可以发现,cat 指令也用不了了,无法读文件了。
当我们给test.txt 加上可执行权限:
我们甚至也可以执行该文件,当然,啥事都不会发送就是了。
这就是文件的权限。
如果我们用root用户操作呢?
来试试:
我们可以看到,这个文件啥权限都没有
但是root想干啥就能干啥,这就是超级用户。
目录文件:
我们接下来测试一些目录文件的权限:
我们发现,当目录没有可执行权限的时候,我们就进不去了
如果没有写权限呢:
我们发现目录文件没有写权限的话,我们在目录里无法创建新文件
如果没有读权限呢:
我们发现没有读权限,可以查看文件的内容,
但是我们无法查看该目录里面有什么文件。
当然,root 用户无论如何,什么功能都能使用。
这里补充一点,other的权限就是指其他用户来访问我的文件是后的权限。
4. 权限如何修改
我们可以使用chmod指令
直接看例子:
给我自己增加读权限:(chmod u+r 文件名)
给所属组增加写权限:(chmod g+w 文件名)
给other增加可执行权限:(chmod o+x 文件名)
通过这三个例子,
我们可以观察出:u就是用户,g就是所属组,o就是other,+就是添加权限
取消所有人的权限:(chmod a-rwx 文件名)
总结:a 是所有人,-就是取消权限。
补充,我们还能这样理解权限:(通过八进制的形式)
实际上,每个位置的权限都是用二进制来表示的:
比如:(我们的test.txt文件)
他的权限现在是 rw- rw- r--
用二进制表示就是:110 110 100
转换成八进制就是:6 6 4
例:(通过数字修改权限)
我们当然也可以:
这就是权限的修改,
实际上我们还可以修改文件的拥有者和所属组,
分别是:
chown + 用户名 + 文件名
chgrp + 所属组名 + 文件名
选项 -R 可以修改目录。
这里我就不演示了,感兴趣的话可以自己去试试。
6. 第一个问题:文件的起始权限
为什么我们一创建文件,他的权限是这样的?
普通文件是:664
目录文件是:775
实际上,Linux系统给普通文件的起始权限是666
而默认给目录文件的起始权限是777
而Linux中存再权限掩码,我们可以用umask查看:
666的权限是:110 110 110(666)
而权限掩码是:000 000 011(0002)
最终的权限是:110 110 100(664)
我不废话,直接说计算规则:
最终权限 = 起始权限 & (~umask)
补充,当然,我们也可以自己修改umask:
我们可以看到,改了umask 之后,起始权限确实变化了。
7. 第二个问题:目录的权限
前面我已经介绍了目录权限相关的操作和现象,
现在有个场景:
有两个用户同时在一个公共目录下工作:(在d1目录下)
xl用户写了个文件,
test 用户可以查看这个文件
因为这个文件给other开发了读权限:
那么,如果我们把读权限取消呢?
这样,test 用户就无法阅读了:
这个时候,test 用户一气之下,想着不给我读是吧,你也别想好过
就想把这个文件删除:
结果这个文件真的被他删了,
明明这个文件不是test用户的,他却能够删除该文件,
很显然,这样的设计并不合理。
实际上,我们刚刚探索过目录的权限,
目录的权限是:
r 代表我们是否能够查看指定目录下的文件
w 代表我们是否能在当前目录下创建、更改和删除文件
这样一说,你可能会想到,那我么直接将该目录的w权限取消,
被人不久删不了文件了吗?是的,但是你要无法操作文件了。
那我们该怎么办?
8. 第三个问题:粘滞位
为了解决前面出现的问题,我们可以给目录设置粘滞位。
具体是怎么操作呢?
我们添加一个隐藏权限 t 给other,t 其实是一种特殊的 x 权限。
这就叫做粘滞位,
我们来看看效果如何:
xl 用户创建了一个test文件
我们发现,test 用户已经无法删除这个文件了:
这就是粘滞位。
实际上,被设置粘滞位的目录只有目录的所有者和文件的所有者才能删除文件。
其实啊,操作系统也提供了一个共享的粘滞位目录在根目录下:
如果有兴趣的话,也可以去体验一下。
总结
本文基本将权限涵盖的知识点都介绍了,相信你对权限的理解能够更上一层楼。
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~
版权归原作者 戊子仲秋 所有, 如有侵权,请联系我们删除。