Linux权限
Linux权限概念
Linux下有两种用户:超级用户(root) 、普通用户。
超级用户:命令提示符是"#",可以再linux系统下做任何事情,不受限制 。普通用户:命令提示符是"$",在linux下做有限的事情。
在Linux基础指令中提到如何创建用户,创建一个用户user,用 ls /home 可以看到一台Linux机器有哪些用户。

touch myprogram.c 创建文件,在文件中写入如下代码。

gcc myprogram.c -o myprogram 生成可执行程序,最后输入指令./myprogram (表示当前目录下的myprogram,直接输入myprogram是不行的)即可运行程序,由于是死循环,可以用Ctrl + C 终止。

输入命令时,系统会去/usr/bin目录下搜索命令,我们可以把文件myprogram拷贝到该目录,root用户有这个的权限,但普通用户没有这个权限。从root用户到普通用户,可以用 exit 或Ctrl + D 退出,再登录普通用户,从普通用户到root用户亦然。
su 用户名 切换用户。例如,要从root用户切换到普通用户user,则使用 su user。要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码。

切换到user,尝试把myprogram拷贝到/usr/bin,会报错。因为/usr/bin 属于系统目录,不允许普通用户修改。

切换到root,就可以把myprogram拷贝到/usr/bin,此时myprogram就能像命令一样被使用。

此时输入exit 又可以退回到user,命令su - 也可以切换到root,区别 是su - 让我们以超级用户的身份重新登录,所以当前所处的目录会改变,而su 切换用户不会改变当前所处目录。

sudo 能暂时提高普通用户的权限,例如安装软件需要管理员root权限,在安装软件的指令前加上sudo即可让普通用户在系统上安装软件。普通用户直接使用sudo会报错。

这里有类似白名单的东西,需要把普通用户user添加到 /etc/sudoers 。vim /etc/sudoers 打开此配置文件,参照下图红框的内容添加user,保存退出后就能正常使用sudo了。

权限首先限制的是角色(人),比如校长才能进校长办公室,张三是校长,张三能进校长办公室;权限要求目标必须具备对应的属性,如即使你是LeetCode的顶级会员,你也不能在LeetCode看电影,因为LeetCode不具有看电影的属性。所以,权限 = 角色 + 目标权限属性
Linux下一切皆文件,面对文件,无外乎是读、写、执行。
角色:拥有者 、所属组 、other。root、user是具体的人,如前文提到的张三,拥有者、所属组、other是角色,对应前文的校长。

不是拥有者、所属组就是other;所属组让身份角色更精细化,如user1属于A组,user2属于B组,使权限管理更精细化。
Linux文件有三种属性:读r、写w、可执行x。

第一列是文件类型,每一行剩下9个字符每3个 一组表示不同信息,分别是拥有者权限位、所属组权限位、other权限位。文件允许读/不允许读为 r/- ,允许写/不允许写为 w/- ,允许执行/不允许执行为 x/- 。

描述a.txt文件的权限信息:a.txt的拥有者是root,拥有者root能读文件、写文件,不能执行文件;所属组是root,能读文件,不能写文件和执行文件;other对该文件只能读。
Linux权限管理
chmod
chmod u-r my.txt 去掉拥有者对文件my.txt的读权限,拥有者、所属组、other分别对应 u 、g 、o ;去掉权限为 - ,增加权限为 +;对拥有者、所属组、other同时操作时,用逗号隔开;chmod a-/+权限 my.txt 可对三者同时去掉或增加权限。

- 用户只能更改自己的文件权限。
- 如果没有权限,系统会拒绝让我们访问。
- 确定权限信息时,系统会先确定用户是谁,是拥有者、所属组、还是other。在Centos,用户角色只确定一次,顺序为拥有者、所属组、other。
- root用户不受权限约束。
- 文件有可执行权限,不代表文件可以执行。如文件my.txt,
chmod u+x my.txt使拥有者具有执行my.txt的权限,但由于my.txt本身不是二进制可执行文件,所以会报错。
一个角色的三个权限 r/- 、w/- 、x/- ,如果具有某个权限为1,不具有为0,则可用三位二进制表示,即用一个8进制数字表示权限。如chmod 777 my.txt ,拥有者的权限为rwx,所属组的权限为rwx,other的权限为rwx。

chown/chgrp
chown 用户名 文件名 更改文件拥有者,chgrp 用户名 文件名 更改所属组。如果是普通用户使用chown/chgrp,需要sudo提权或用su切换为root。

chown 用户名:用户名 文件名 同时更改文件的拥有者和所属组。

目录权限
默认情况下,创建一个新目录,rwx权限都要有。
如果对目录没有权限r,就不能查看目录里的文件。如other对目录test有r权限,用chmod去掉other的r权限后,切换成user就无法查看test里面的文件。

如果对目录没有w权限,则无法在指定目录内部新建文件。如对于目录test,other没有w权限,所以user不能在test新建文件。

切换成root,给other加上w权限,user即可在test创建文件。

如果对目录没有x权限,则无法进入目录。

Linux多用户之间是相互隔离的,如下图,任何一个用户只对自己有rwx权限,无法进入其他用户的家目录。

umask
对于普通文件,起始权限为666,即默认不带x;对于目录文件,起始权限为777,即都带rwx。但是新建的普通文件和目录不是这样的,系统存在一个权限掩码,umask 可查看权限掩码。

新建普通文件和目录的权限 = 起始权限 & (~umask) 。

新建普通文件root.txt,其权限如图,即 110 100 100 。普通文件的起始权限为666,即 110 110 110 ,umask只看后三位,即 000 010 010 ,位运算得110 100 100 。

umask的目的是希望凡是在umask中出现的权限,都不应该在最终权限出现。
为什么要有umask?
- 默认权限,由OS自主决定,无法在创建文件前修改,这样就写死了权限。有umask,可以配置权限,灵活满足需要。
- 特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码都是可控的。
umask也可以修改,当umask为0777时,新建文件的所有权限都被关闭。

umask是写在内存中的,退出后重新打开XShell,umask还是0022。
粘滞位
一个文件能否被删除,与文件本身的rwx权限无关,如果该文件所处目录对角色开放w权限,如目录对other开放w权限,那么普通用户能删除该文件,因为这本质是利用w权限对目录进行写。

共享类文件,不想让非文件拥有者能删除对应文件 。所以,我们的需求是任何人都能在一个共享目录里新建文件,但是非文件拥有者不能删除文件,共享目录一般放在根目录下。
引入一个权限标志位 t ,即粘滞位 ,根目录下的tmp 目录也带粘滞位。粘滞位目录下的文件只能被root、目录拥有者、文件拥有者删除。只能给需要共享的目录添加粘滞位。chmod +t 目录 添加粘滞位。

user、user1在目录temp_Backup分别创建两个文件。

user删除2.txt,user1删除1.txt,会报错,此时非文件拥有者就不能删除文件了。
