目录
一、文件权限的概念
二、Linux命令`ll`的结果解析
三、Linux修改权限的两种方法
四、更改文件的拥有者和所属组
五、身份的判定
六、系统掩码
七、删除文件需要的权限
八、粘滞位
1.是什么?
简单地说就是什么身份的用户能对文件做什么事。
文件权限的核心 = 用户(用户的身份)+ 事务属性(能做的事)
(这样就能表示一个用户能对该文件做什么事)
2. Linux中的权限管理分为三个不同的类别(用户的身份):文件拥有者、同组用户 以及 其他用户 。
3. 常见的权限(能做的事):r:读权限(read);w:写权限(write);x:执行(execute)。
1. 文件类型
ll指令显示的每列的第一个字符,表明该文件的文件类型。
eg . 使用ll命令查看文件类型
拓:Linux和Windows不同,Linux不以文件后缀来区分文件类型。
(Linux系统不看文件后缀,但可以给自己看,用来区分文件)
2.拥有者和所属组和其他用户
ll指令显示的每列的第12~14个字符是文件的拥有者的用户名,第15~17个字符是文件的所属组的用户名。
拥有者 和 所属组 是用户的一个身份,标签。
3.拥有者,所属组,other 的权限。
ll指令显示的每列的第2~10个字符表示文件的拥有者,所属组,other 的权限。
第2~4个字符表示 拥有者 是否有 读、写、执行 权限。
第5~7个字符表示 所属组 是否有 读、写、执行 权限。
第8~10个字符表示 other 是否有 读、写、执行 权限。r :读权限(read)、w :写权限(write)、x :执行(execute)。
有该权限会显示字母,没有该权限就是 - 。
rwx的位置已经固定了,如:有读权限,第一个位置就是r,否则就是 - 。不可能出现 wrx 和 xwr 等情况。
4.ll指令显示的每列的第4个字符串表示文件占用空间大小,单位是字节。
5.ll指令显示的每列的第5个字符串表示文件的最近修改时间。
6.ll指令显示的每列的第6个字符串表示文件名。
总结:
拓1:权限的具体体现
拓2:没有相应的权限:Permission denied
eg. 没有执行权限:
两种方法都要使用chmod指令。(chmod 指令:修改权限。)
1.方法一:
chmod u/g/o +/- r/w/x 文件名
(+加上权限, -删除权限 )
a.修改拥有者(u)的权限:
chmod u +/- r/w/x 文件名
eg. 删除test.txt文件拥有者的读权限,给拥有者加上执行权限:
(要修改多个权限时 用 ,隔开)
b.修改所属组(g)的权限:
chmod g +/- r/w/x 文件名
eg.删除所属组的写权限,给拥有者加上执行权限:
c.修改other(o)的权限:
chmod o +/- r/w/x 文件名
eg.删除所属组的读权限,给拥有者加上写权限:
d.修改所有身份(a)的权限:
chmod a +/- r/w/x 文件名
eg.删除所有身份的执行权限,给给所有身份加上读权限:
eg.删除拥有者的读写权限,给所属组加上写权限,删除other的写权限:
(要修改多个权限时 用 ,隔开。)
拓1:权限的具体体现
cat 就是在读一个文件,需要读权限。
> 输出重定向 就是在 写一个文件,需要写权限。
输入文件路径回车 就是执行文件,需要执行权限。
拓2:Permission denied(权限被拒绝)
当没有执行相应操作的权限,会打印该提示。
2.八进制修改法
chmod XXX 文件名
可以使用chmod 和一个三位的八进制数来修改权限。
eg. chmod 777 test.txt
修改权限,让file.tx文件的所有身份都有读,写,执行的权限:
eg. chmod 664
将文件修改为:拥有者可读可写,所属组可读可写,other只读:
原理:
因为有和没有恰好是两种状态,可以用0,1二进制表示,一个身份有三个需要判断的权限可以使用一个三位的二进制数来表示该身份有哪些权限,而三位的二进制数又可以转化为一位八进制数,有三个身份(拥有者,所属组,other)的权限要表示,所以我们可以使用一个三位八进制数来表示所有身份的权限。
如:
111表示所有身份都只有执行的权限。
777表示所有身份都只有读,写,执行的权限。
000表示所有身份都没有任何权限。
方法一:在root用户下强制更改
(在普通用户下无法强制更改)
1.chown 用户名 路径/文件名 : 更改文件的拥有者 为指定用户。
修改目录的拥有者时可以加上选项 -R : 递归处理,将指定目录下的所有文件及子目录一并处理。
2.chgrp 用户名 路径/文件名 :更改文件的所属组为指定用户。
3.chown 用户名:用户名 路径/文件名 : 修改文件的拥有者和所属组为指定用户。
(chown 后面跟两个用户(中间用 : 隔开)即可同时修改文件的拥有者和所属组为指定用户。)
方法二:在命令前加上sudo,以root的权限级别来执行该命令
要使用sudo要先把当前用户加入到信任列表中。添加信任列表需要在root身份下执行。
将用户添加到信任列表不是本章重点,不在这展开讲,想要了解的小伙伴请看:
执行该命令还要输入当前执行该命令的用户的密码。不是你要修改的文件拥有者的用户的密码。
这样可以不切换到root用户直接修改文件的拥有者和所属组。
拓:为什么没有命令可以将用户身份直接修改为other?
因为other不确定。
当一个用户对文件进行操作时要先判定改用户对于文件的身份:
看当前用户的用户名来确定身份,是文件的拥有者 或 所属组 或是 other
只判定一次,优先判定拥有者,一旦判定为拥有者哪怕是所属组也不再判定。
(用户可以即是拥有者也是所属组)
1. Linux默认:
一个目录被创建,起始权限是从777开始;
一个普通文件被创建,起始权限从 666 开始。
2. 但为什么我们创建出来就不是这个样子?
eg.观察刚创建的文件的权限
因为Linux会通过系统掩码进行一些计算,得到一个新的权限,成为创建出的目录和文件的权限。所以我们创建出来的文件/目录的权限不是666/777。
3. Linux系统默认的系统掩码为0002 。(计算时只取后3位)
eg. 使用umask查看系统掩码:
4. 计算最终权限
计算过程:最终权限 = 起始权限 & (~系统掩码)
把权限和系统掩码的3位八进制数 转化为 9位的二进制数(系统掩码的八进制数有4位,但计算时只取后3位),然后把系统掩码的9位二进制数按位取反,两串二进制数再进行按位与,得到最终权限。
eg. 创建目录/普通文件后的权限的计算过程:
所以系统掩码的作用就是系统用来修改刚创建的文件/目录的起始权限,生成最终权限。
5. 使用umask修改系统掩码:
eg. umask 0777:修改系统掩码为 0777:
修改后系统掩码后,计算最终权限时使用修改后的系统掩码。
eg.修改系统掩码为0777后创建文件:
对于本用户不能读和写和执行的文件,我们可以直接使用rm将其删除。这是否意味着删除一个文件不需要什么权限?
出现什么的情况是因为:删除一个文件或目录不是该文件的拥有者和所属组说了算,而是文件的所处的目录说了算,删除目录中的文件/目录需要对该目录具有写权限。
总结:所以能不能删除一个文件/目录,要看该用户有没有 该文件/目录的上级目录 的写权限。
所以一个用户可以在公开的目录下删除另一个用户的文件。(设置公开目录:将目录的other的权限为rwx)
eg. 一个用户在公开的目录下删除另一个用户的文件:
0.问题导入
当所有用户共享一个目录,且对该目录具有读写执行权限,能不能做到:
a.多个用户共享一个目录,能在该目录下,进行读写、创建、执行文件。
b.但是自己只能删除自己的文件,而不能删除别的用户的文件。
可以通过删除写权限(w)达到目的吗?
不能,因为删除了目录的写权限,虽然无法删除目录下的文件了,但同时我们也无法在该目录下创建文件。
这个时候我们要用到一个新的权限:粘滞位。
拓:创建公共目录
公共目录要在根目录(/)下创建,且创建出目录的other的权限改为rwx,才算完成了公共目录的创建。
1.粘滞位的概念
粘滞位和 r/w/x(读/写/执行) 一样也是一种权限,是系统权限的一个旗标,用符号t表示。
给目录的other 设置 t(粘滞位)可以做到当多个用户在同一目录下工作时,能读写,创建,删除自己的文件,但不能删除别的用户的文件。
2.设置粘滞位:chmod +t mytemp
eg. 给公共目录设置粘滞位权限:
eg. 粘滞位的使用:
注:
t是权限x的特殊情况,表示能访问但不能删除。
t只能给目录设置,且设置设置时不需要指定用户,默认给other。
粘滞位一般是谁设置,谁才能取消(root)。
粘滞位,适用于多个用户在同一个目录下工作的情况。
不用担心别的用户能删除自己目录下的文件,因为一个用户对其他用户的家目录没有任何权限,无法进行任何操作。
拓、常见权限问题