d1 目录下有目录dir,和一个普通文件 test.c
重点看到文件的各种权限,拆分清晰地理解(重)
观察到权限和文件类型一坨除了第一列的文件类型其他的都是文件相关的权限,而且是三个三个分开
为什么分开呢?是因为在 Linux 中主要有三种身份:拥有者,所属组和其他人
拥有者:拥有该文件的人,一开始对该文件的权限一般最高
所属组:一组用户的集合,可以给这个组分配对于该文件的相关权限
其他人:除了拥有者和所属组,其他的都属于其他人
三种身份对应各自的权限,所以那坨权限三个三个分开看,分别对应拥有者,所属组和其他人(如上图)
而权限看到有 rwx 或者说 - 是什么意思呢?
原来一个文件一般有三种权限:
r:读权限(read)
w:写权限(write)
x:运行权限(执行)
其中rwx是固定位置的,不能随意变动位置;如果对应位置上的权限不拥有,就用 ' - ' 表示
其中要注意的是普通文件的x和目录的x的理解:
普通文件的x权限:表示该文件是否有运行的权限
目录 的x权限:表示该目录是否允许进入,目录的运行权限 表示 能不能进去这个目录
并且当目录不能进入的时候(x对应位置为 - ),如果有r(读)权限还是可以读到目录里面的内容,但是有无w(写)权限都是没用的,进不去,怎么在目录里面创建或者说修改东西
还有一个细节的思考清楚:
当拥有者和所属组都是一个人yxr,但是拥有者的权限是 r--(只能读),而所属组的权限是:rw-(可以读和写) ;问现在你就是拥有者yxr时,有没有w(写)的权限?
要清晰:是 没有的!!很多人会疑惑yxr不也是所属组嘛,为什么不能有w写的权限?
细节来咯:壳壳进行身份匹配时,先看是不是拥有者,再看是不是所属组,如果不是那就是其他人;好,重点来咯,如果匹配到你是拥有者,就直接以拥有者的身份进去,不会再去所属组中去查找;
所以这里匹配到你是拥有者那就直接以拥有者的身份去查找对应权限,所以权限只有 r--
(身份匹配相当于一个 if () else if () else() 的语句,进去一个就不会再出来了)
现在进入第二阶段:
权限的修改
一个文件的权限是可以修改的,身份(拥有者,所属组和其他人)对应的权限(除第一三个三个)是可以修改的
首先,文件的拥有者是可以对权限进行修改的(理所应当);当然,还有老卵大哥root也是可以的(root连拥有者都可以修改)
但是最容易忘记的是所属组是不能进行权限修改的(这个反而容易忘记)
改变方法当然是 chmod 啦,具体指令看思维导图
拥有者和所属组的修改
思考:
就算你是文件拥有者,能不能直接把这个文件给其他用户或者root?
不能,你给别人一个文件,不知道你给的这个文件里面有没有不干净的东西,所以就算你是文件拥有者,不能随便把一个文件给别人
只有说有root权限才能:
root用户可以随便把一个文件改成谁的,或者通过拉白名单用sudo提权(将一个语句提升为root权限),来修改文件的拥有者,所属组和其他人
(意思是只有拥有root权限才能这样该文件的身份信息)
浅说语法: ch--- 目标用户 文件名
chown:改变拥有者
chgrp:改变所属组
chown 目标拥有者:目标所属组 文件名 :同时改变拥有者和所属组
最后一个大块头,要经常回来看(尽量),关系到你和几个人共享的能力,在Linux上的交流能力
文件权限的目标
目录的权限 和 普通文件的权限是对于什么来说的,来限制和给什么授权的,必须得搞清楚(虽然简单,但是必须非常清晰)—— 简单的事情做到极致
首先看普通文件的权限 rwx 是对于什么来说的:是对于该普通文件的内容来说的!
其中 r(读)权限表示:对应身份的用户是否能读到该普通文件的内容
其中 w(写)权限表示:对应身份的用户是否能对该普通文件的内容进行修改(写进内容,删除里面的内容等)
其中 x(执行)权限表示:对应身份的用户是否能运行该普通文件的内容
在看到目录的权限 rwx :是对于该目录中的内容(目录中的子目录或文件)来说的!!
其中 r(读)权限表示:对应身份的用户是否能读到该目录里面的子目录或普通文件(内容)
其中 w(写)权限表示:对应身份的用户是否能在该目录下创建文件或删除文件(能否对目录的内容进行修改)
其中 x(执行)权限表示:对应身份的用户是否能进入该目录(运行该目录的内容即是能否进入该目录,去和文件内容在一起)
总的来说,权限是对于目录或普通文件的内容来说的
最后要清楚:
当看到一个普通文件的权限默认为664(rw-rw-r--),虽然这个文件中的内容还不能运行起来,但是能不能现在就把该文件的x权限全部打开呢?
可以,可以将该文件给各用户的权限现在就变为可执行(对应 - 变为 x),但是运不运行得起来又是另一回事
这就映射出很重要的一件事:Linux的权限和在Linux上打在的其他运行工具是分离的
尽可以把对应位置上的 - 变为 x,但是运不运行得起来和Linux没有关系,而是和Linux上的对应的运行工具有关(是看符不符合它的语法)
所以才有了gcc编译生成可执行程序这一步,gcc大概是调用了这些工具,能不能成功运行时看文件内容了