Linux下有两种用户:超级用户(root)、普通用户。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
通过 su -root (root可以省略)指令可以变成超级用户,同样 su -用户名 也可以变成普通用户。
sudo代表的是临时权限提升,执行后续命令以root身份运行,输入该指令后要求输入普通用户的密码([sudo] password for name)。
权限:一件事情是否允许被特定的人做。权限=人+属性
权限约束的是人,文件本身具有的天然的权限属性:读 (r -)、写 (w -)、执行 (x -)。
上述三种用户类别:指的是一种角色身份;
root和普通用户:指的是具体的一个人。
Linux系统中,不以文件后缀作为区分文件类型的方式。
虽然系统不区分,但是gcc编译器会区分,因为编译器就是以文件格式来识别内容范畴的。
普通文件:文本,各种动静态库,可执行程序,源程序
目录文件
还有各种文件不一一列举:Linux下一切皆是文件。
r即具有读权限,w具有写权限,x具有可执行权限
这里用root进行举例,未使用同组用户
第三列 r- - 是o(other其他人),这里不作标识。
如下图所示:
chmod是权限修改指令,u表示操作的用户类别user,+表示权限加,x表示可执行权限。文件类型的第一列就是拥有者的权限类别。
如下图的-rw-(可读可写),执行后变成了-rwx(可读可写可执行)。
也可以对其再进行权限缩小,相当于做减法,这里不演示。
其他操作与之类似,只不过是更换操作对象和权限类型,还可以对o(other其他人)进行类似操作。
当你操作的对象不是root,并且没有对应的权限时,相关操作无法进行。如没有写操作,是无法对其文件内容进行写入的。写入后会得到这样的结果:
Permission denied//对文件操作被系统拒绝
那如果你操作的对象就是root呢?那么上述操作其实对它都是无用的,除了个别执行操作。
对于root用户(超级用户),它几乎是不受权限约束的。也就是说无论你操作哪类用户,无论你如何修改其权限,他该干什么还是干什么,所以上述操作其实都是无用功,但是我只是用root来进行举例,换成其他用户就会有限制了。
如果一个文件是普通用户创建的,但是root想修改为它自己的,这是不被允许的。反过来,如果这个用户要把这个文件转移给root,这是要经过允许而不是直接就可以给的(这个过程需要sudo,强行完成这个操作);但是这时候普通用户如果想再把这个文件要回来,是可以直接完成这个操作的,即使对方是root,原因是这个文件本就属于它(普通用户)。
这就好比它(普通用户)想要别人的东西,需要别人同意;而它想给别人东西,也同样要别人同意收下,但是对方同意了以后,它还是可以随时要回来。
但是如果给别人东西的是root的话,是可以直接给的,而不需要经过该用户的操作。 root就是有这种功能。
同理,普通用户如果给别人东西被拒绝,sudo让自己变成超级用户,这个文件它不要也必须强行收下。(su改完以后路径不变,su -改完以后路径会变)
可以修改个人的权限,同样也可以修改组别的权限,以达到每个成员都有相同的权限。就相当于进入一个团体,每个成员都要按照团体的规则限制来处理事情。(chown可以一次性修改多人的权限)
具体操作是把同组人员设置为所需权限,把other设置为不可读不可写不可执行。
这样的好处是某个文件内容自己组别的人都可以看到但是别的组别不能看见,保证了团队的重要隐私。
当用户对某个目录没有了读的权限时,就相当于没有了查看该目录内容(注意不是进入该目录)的权限。
但是如果它还有写权限,就还可以在该目录下创建文件。
那么要进入目录有什么文件?—可执行权限x。 这和普通文件不同的就是,文件拥有了可执行权限以后代表着能够跑起来,而目录是能够进入该目录。
那么如果我没有进入的权限,但是又有读权限,会有什么结果?—输出目录名。 相当于只给你在门口看看招牌。
那么问题来了:只要某用户具有目录的写权限, 某用户就可以删除目录中的文件, 而不论创建目录的这个用户是否有这个文件的写权限,尽管对方是root。那么这样岂不是很荒唐?
这确实是矛盾的地方,既想让别人进来又不想让别人碰你的东西;但也不是没有解决方法,这种技术叫做粘滞位。
粘滞位格式:chmod 用户+t (目录名)
粘滞位只能对目录进行操作,并且一般是对于other用户;也就是别的组别的人。
对设置了粘滞位的目录,只有文件的拥有者(root)可以删除,其他人不能删除;但是而其他人可以创建文件。
设置了粘滞位的目录,该目录下的文件只能被这些人删除:
有时候,会创建许多的临时数据,一般会把这些数据放到系统的/tmp目录下,这也就意味着它要把所有权限都放开。但是这时候又会有被别人删自己文件的风险,这时候就可以再次设置粘滞位。
为什么系统中的文件,创建出来的默认权限是我所看到的样子?
这里首先说明,因为权限要么就有,要么就没有;权限的位置是确定的并且是两态的。所以是可以用0、1两个数字八进制来代表权限的有无的(因为每个权限有三位,而二进制的三位最大数为八,所以采用八进制),例如:- r-- rw- —;可以看成- 100 110 000
默认权限:
普通文件:起始权限为666(8进制)
目录文件:起始权限为777
但是为什么不是我看到的那样?
这里就要引出权限掩码的概念:
权限掩码(0002,umask):凡是在umask中出现的,都应该在起始权限中去掉。 其实就好比c语言中1111 1111要消除低四位用1111 0000进行与操作的道理。
掩码的作用主要是去除一些操作者不想让该文件拥有的权限。
比如普通文件的起始权限:110 110 110
如果权限掩码是000 000 010(八进制002),这个掩码的意思是说:如果你给我的权限对应的八进制在我掩码有1的地方同样也有1的话,就要去除。那么看普通文件的起始权限为110 110 110(666),它要去除的位置应该是从右向左数第二位上的1,我们可以通过这种方式将它去除:先把掩码取反,再和权限相与。 这样一来,得到的权限就为110 110 100(664),就相当于去除了对应位置上的1,也就去除了起始权限的某一种权限,以此达到目的。
默认权限是可以自定义的,如果想要三个用户都是只读状态,可以执行:
$ umask 0333
但是这种修改只在本次登录有效,下一次登录就失效了。