目录
一、Linux下的权限概念
Ⅰ、是什么?
对于权限,在我们日常中就有体现,如vip,学校的门禁等,说白了就是通过一定的条件拦住一部分人,给另外一部分人权利去访问特定的资源,本质就是有没有或者能不能的问题。所以权限一个简单的定义:既与人相关,还和事物的属性相关,即权限=人+事物的属性。
Ⅱ、Linux下的两种角色
角色
**①超级用户(root):**可以在Linux系统下做任何的事情,不受任何的限制,拥有最高的权力。
②普通用户:可以在Linux下做有限的事情。
区分两者:
如何添加普通用户
对于添加普通用户的操作一定是以root身份去添加的,因为权力大嘛!
添加命令:useradd -m username(用户名) 或者 adduser 用户名
设置密码:passwd username(用户名)
删除用户:userdel -r username(用户名)(目录需递归删除)
细节问题:
①若直接采用useradd +用户名的方式,这种方式仅仅只是创建了一个用户名。并没有在系统中的用户表,使用它是登录不了的,也删除不了。
②采用useradd -m username(用户名) 或者 adduser 用户名(成功的方式)
注意:成功添加的用户会被放在家目录下,也就是home目录!!
身份的转化方式
①普通人--->root
命令:su root(root可以省略)或者 su -
值得注意的是:设置密码时,普通用户和root的密码最好不要一样。
②root--->普通用户
命令:su 用户名
可以看到这里并没有要求输入密码,因为root具有最高的权力,可以为所欲为!
身份的提权
很多时候身为普通用户,我们并不想直接切换成root身份,但是我就是想以root身份去执行一个工作, 这时候我们可以采用提权的方式去实现,就是给普通用户一个权力,把一些本来普通用户不能执行的指令赋予当前用户执行!
命令:sudo 需要执行的操作
经过上述操作,我们就不需要切换成root用户去执行一个指令!
对于上面的指令提权操作,大家在初次使用时,并不能实现!**因为在系统中会存在一份白名单(信任列表),只有在白名单上的普通用户才能够去使用sudo去提权。**比如上述的curry用户就不能执行sudo,因为它还没在白名单上。
从上图可以看出,curry这个用户无法执行sudo指令!!!
添加普通用户至白名单
此操作也需要在root身份下去执行!
①切换身份
②输入vim /etc/sudoers进行添加对应的用户
③添加成功,就可以采用sudo的指令进行提权了!
二、Linux下的权限管理
Ⅰ、文件访问者的分类(Linux下的"人")
①文件或者目录的拥有者(User)
②文件或者目录的所需组(Group)
③既不是拥有者也不是所属组的其他人(other)
拥有者顾名思义,就是该文件或者目录的创始人。那么**为什么要存在一个所属组的概念呢?**试想以下场景:
在一个公司内部,存在很多部门,每个部门都负责有特定的工作,假设每个部门都存在着某种竞争关系,假如有一天,老板需要看你写的项目时,老板这个角色对于你这个项目他是属于其他人 ,因此你不得不将文件的访问权限放开,让其他人都看见,这就会引发一个问题,隔壁部门的也是属于其他人,而你们又是竞争关系,可是你并不想让隔壁部门的看见文件内容,所以就必需要有分组,此时只需要把你的老板放入该组中并打开组的权限,那么隔壁部门就无法访问到具体的文件内容了,一举两得嘛!
所以的所以,Linux具有组的概念,主要是为了进行多人协作时能更好的进行权限管理!!
看到这里估计又有疑问,Linux下既有"角色",又有"人",不冲突吗?实际上一点也不,not at all!,反而还是相互补充的关系!因为具体的角色需要具体的人去扮演,比如root可以是拥有者,也可以是所属组,还可以是其他人!你品!你细品!
Ⅱ、文件类型和访问权限(事物属性)
1.文件类型
window系统下,我们习惯采用后缀名的方式去区分文件,而在Linux下并不通过后缀名去区分文件,但这并不是说不需要后缀!!!那是如何区分呢?
d:代表该文件是一个目录文件
-:代表普通文件
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
l:软链接(类似Windows的快捷方式)
值得注意的是:Linux不通过后缀名去区分文件类型,但是Linux上面的工具可能区分!!
演示一下:现在有个.c后缀的C语言代码
若将其后缀改为.txt,在使用gcc编译器(Linux中编译工具)去编译,这时会失败!因为gcc只编译.c为后缀的文件
所以在Linux上我们可以使用后缀!!!以防上面的情况出现嘛!
file指令(查看文件类型)
命令:file 【选项】文件或者目录......
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
2.文件权限
权限表示方法:
a、字符表示
一般分三种:
①r:可读
②w:可写
③x:可执行
注意:是3个3个为一组,依次拥有者、所属组、其他!每一组的第一个字符为是否可读,是就为r,否则为-,第二个字符为是否可写,第三个字符为是否可执行!!!
b、8进制表示
|------|-----|-----|
| 权限符号 | 8进制 | 二进制 |
| r-- | 4 | 100 |
| -w- | 2 | 010 |
| --x | 1 | 001 |
| rw- | 6 | 110 |
| r-x | 5 | 101 |
| -wx | 3 | 011 |
| rwx | 7 | 111 |
| --- | 0 | 000 |
举例:
小总结:不难发现,当具有某个权限时,对应位置就记为1,不具有就是0,3个3个位一组,再转化为8进制!!
细节问题:如何理解X可执行权限vs 可执行?
先看演示:
可以看到,虽然test.txt具有x可执行权限,但是它本身并不可执行文件,因此它不能运行!
在看演示:
上图可以看出,a.out本身是一个可执行文件,但是呢当去掉可执行权限x时,它也不能运行了!!
从上面的两个案例可以得出:可执行=具有可执行权限x+文件本身就是一个可执行文件
两者缺一不可!!!
权限的修改方式
通过概念我们知道:权限=人 + 文件的属性。所以修改的方法也有多种,可以改"人",也可以改"文件"。
注意:一个文件权限的修改,只能是root或者文件的拥有者!!
a、修改文件属性
字符修改
u:拥有者
g:所属组
o:其他人
a:所有的人
+:增加权限
-:取消权限
①单个修改
命令:chmod u/g/o/a +- r/w/x/rwx的组合 filename(文件名)
演示:
②多个一起修改
命令:chmod u+- r/w/x/rwx的组合,g+- r/w/x/rwx的组合,o+- r/w/x/rwx的组合 filename(文件名)
演示:
8进制修改
命令:chmod 8进制 filename
演示:
b、修改"人"
注意:需要root身份才能执行,可以采用su指令切换身份或者sudo + 对应操作指令进行提权!!
①修改文件拥有者:
命令:chown 新的用户名 文件名
②修改文件所属组:
命令:chgrp [参数] 用户名 文件名
参数:-r 递归修改文件或者目录的所属组
③同时修改
**命令:**chown name1:name2 filename
含义:依次将对应文件的拥有者、所属组给改了!
注意:为啥没有other?其实就是因为当你既不是拥有者也不是所属组的时候,那你注定是其他人咯!!
把文件给别人是强制给的!!!
权限有无的表现
①普通用户
情景1:文件本身
可见当文件没有rwx时,上述的指令都不能实现文件的相关操作,即不可读不可写不执行!!!
情景2:人相关
上述操作的含义:首先我是suri这个用户,对于newfile.txt这个文件来说我既不是拥有者也不是所属组,那么suri用户为其他人,而其他人没有rwx权限,所以当suri访问newfile.txt这个文件时,既不能写也不能读更不可执行!!
情景3:人的匹配问题
大家看到这个估计有疑问了,suri这个用户他虽然不是拥有着但是他是所属组啊,所属组具有可读可写可执行啊,为啥会失败?
实际上就是匹配问题:对用户的身份识别,只进行一次匹配!一旦匹配成功,就不会在进行下去!所以suri用户第一次匹配到的就是拥有者的身份,而拥有者并没有rwx权限,因此操作失败!!
来看个成功的演示:
对于suri用户具有可读可写可执行权限,但是呢因为newfile.txt本身就不是一个可执行文件,即使给了它可执行权限也没有太大用。
②root用户
对于root,权限对于它来说是没有任何作用的,因为他就是最高的权力者!!!
演示看看root的权力:
上述操作中,root对于文件newfile.txt是其他人的身份,该文件其他人权限并没有rwx,但是呢,root一样可以读写可执行,但由于文件本身不是一个可执行文件,因此无法成功执行!!
从上述案例可以看出,权限都是用来限制普通人的,它的存在就是为了保证普通用户文件的一般的安全性!!!!!
3.目录权限
- **可读(r)权限:**决定用户能否查看指定目录内的文件信息
- 可执行(X)权限:该权限的有无决定用户能否进入到指定目录中
- 可读(W)权限:该权限的有无决定用户能否在指定的目录中新增,修改,删除文件!
由目录可读(W)权限引发的一个有意思的问题
难道普通用户就不能删除root文件吗?
来看操作
dir目录是在suri这个用户下的一个子目录,该目录里有着一批文件,其中里面存在着两个由root身份创建的文件,如下:
按照我们的认知,root用户是最高权力者,普通用户无法对他所创建的文件或者目录下手,但是事实真的如此吗?
可以看到,suri这个用户成功将root创建文件给删除了 !逆天了?这个合理吗?答案是合理的!!
首先这个dir目录是在suri的家目录下的一个子目录,suri是该文件的拥有者(Linux下一切皆文件),它对该目录具有可读(W)权限。
具有可读权限那就是说明suri这个用户能对该目录的内容进行增删改操作,即能对目录的文件以及其下的子目录进行增删改操作!!不管你是谁,你在我的目录下创建文件,那我就有权力删除!!
结论:删除一个文件和目标文件的属性没有任何的关系,只和该文件所在的目录有关系!!! 也就是用户在当前目录是否具有w权限。如果有,那就可以进行删除操作,因为删除一个文件的本质就是修改目录的内容!!!!!
如果我们想在Linux下实现多个用户文件级别的信息共享 ,那么我们只能在系统的非用户目录下去创建,不能再任何一个用户的家目录下去创建该文件!!因为一个用户的家目录是不能随便进入的!
在系统的非用户目录下去新建一个共享目录,默认其他人的w权限是放开的,因为要进行文件共享,w权限必须打开。一旦打开w权限,那么其他人都具有删除当前目录下的文件的能力。可是我们并不希望这样的情况发生,共享目录下不仅仅有一个用户,而是多个用户,如果每个用户都具有删除其他文件的能力,那就不合理了!人家辛辛苦苦写的文件,你说删就删?
因此针对上述不科学的现象,关闭w权限是不可能的的了,那就需要给这个共享目录添加一个粘滞位了,该粘滞位仅用于目录,并且用于限制其他人!
粘滞位(为目录准备的)
命令 :chmod +t 目标目录
t:相当于x的加强版,能进目录但不能删除目标目录下的文件及其他内容!
用途:可以将一个目录设置为粘滞位,被设置粘滞位的目录,该目录下的内容(文件)只能由:
①root用户删除
②该文件的拥有者删除
演示:
上述操作:可以看到,syw这个用户对于该共享目录来说是其他人,具有w权限,但由于这个目录对其他人添加了粘滞位,syw用户就不能删除当前目录下的任何一个文件,但可以新建文件!能不能改人家的文件得看他有没有这个权限咯!
4.权限掩码umask
为社么每次我们在新建目录或者文件的时候,好像都有一个默认权限,文件的是664,目录的是775?
Linux下:
创建文件的起始权限:0666,去掉x的
创建目录的起始权限:0777,包含x的
规定:创建文件/目录的时候,要从起始权限中,过滤掉(不是简单减法)在umask中出现的权限!
最终的权限=起始权限 & (~umask)
注意:umask大家的默认值不一样是正常的,不同的环境下一般都不一样,比如小编的centos7.8下的umask为0002
所以根据上面的公式:
创建一个文件的最终权限:0664=0666 &(~0002)
创建一个目录的最终权限:0775=0777 &(~0002)
以文件为例:
当然哦,这个umask我们也可以手动修改,指令也非常简单
修改后在新建文件/目录时,默认的权限也会改变!
好了,以上就是小编在Linux学习权限的心得与总结,如果对你有帮助,只需点赞和收藏!!有问题,欢迎来真实!