一. 目录权限
-
可执行权限 (x) : 如果目录没有可执行权限, 则无法
cd
到目录中. -
可读权限 (r) : 如果目录没有可读权限, 则无法用
ls
等命令查看目录中的文件详细信息. -
可写权限 (w) : 如果目录没有可写权限, 则无法用
touch
,echo
等命令在目录中创建文件, 也无法在目录中用rm
命令删除文件.
目录的可执行权限 (x)
当该目录的拥有者没有了可执行权限 (x), 则无法 cd
进入该目录.
目录的可读权限 (r)
当目录的拥有者没有可读权限 (r), 则无法用 ls
等命令查看目录中的文件详细信息.
目录的可写权限 (x)
当目录的拥有者没有可写权限 (w), 则无法用 touch
, echo
等命令在目录中创建文件.
也无法在目录中用 rm
命令删除文件.
二. 起始权限
默认权限
-
新建文件默认权限: 0666 (前导 0 代表八进制)
-
新建目录默认权限: 0777 (前导 0 代表八进制)
但实际上你所创建的文件和目录, 看到的权限往往不是上面这个值, 原因就是创建文件或目录的时候还要受到 umask
的影响, 假设默认权限是 mask , 则实际创建出来的文件或目录权限是: mask & ~umask, 我们称其为起始权限.
umask (权限掩码)
umask
查看用户的权限掩码.
普通用户的权限掩码默认为 0002 (前导 0 代表八进制).
root 的权限掩码默认为 0022 (前导 0 代表八进制).
可以看到, 对于 root 和普通用户, 他们有着不同的权限掩码值, 所以创建出来的文件和目录会有着不一样的起始权限.
也可以通过 umask + 新权限掩码 修改权限掩码.
普通用户和 root 的起始权限
对于普通用户来说, 创建文件的起始权限为 664.
创建目录的起始权限为 775.
对于 root 来说, 创建文件的起始权限为 644.
创建目录的起始权限为 755.
起始权限产生机理
初学者很容易误认为, 起始权限 = 默认权限 - 权限掩码.
但是其实正确的机理是 起始权限 = 默认权限 & ~权限掩码.
我们先将用户切换到普通用户下, 把权限掩码改为 0001.
如果按照 起始权限 = 默认权限 - 权限掩码的逻辑, 我们创建一个文件, 它的起始权限应该是 665.
可是我们会发现, 这个新文件的起始权限为 666.
但是如果按照 起始权限 = 默认权限 & ~权限掩码的逻辑, 就说的通了.
得出结论: 起始权限的产生机理为 起始权限 = 默认权限 & ~umask.
三. 粘滞位
共享目录
当我们在使用 Linux 的时候, 可能会有一些共享目录, 被所有普通用户共享, 用来保存普通用户临时创建的文件与目录.
首先我们以 root 的身份, 在根目录 (/
) 下创建一个共享目录 public
, 再将其默认权限改为 777, 即为共享目录, 任意用户可以在该目录下共享文件.
普通共享目录所存在的问题
普通共享目录下存在一些问题.
普通用户 Aurora 创建了一个新文件, 并向其中写入一些字符串, 由起始权限的知识可知, 该文件对于 other (使用共享目录的其他用户) 而言, 只有读权限, 其他用户也可以查看该文件的内容.
但是有一天, 普通用户 Aurora 向文件 test.txt
中写入了一些私密的信息, 不希望他人看见, 于是关掉了对于 other 的所有权限.
当使用共享目录的其他用户想再次查看该文件的时候, 会发现没有相应的权限.
于是该普通用户一气之下删除了该文件.
那么问题来了.
只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.
为了解决这个不科学的问题, 我们引入粘滞位的概念.
粘滞位
chmod + t [目录名]
给共享目录加上粘滞位.
此时普通文件不能被其他用户删除了.
一些疑问与解答
1. 为什么只能给共享目录添加粘滞位, 而不直接把 other 的写 [w] 权限去掉?
若是将 other 的写[w] 权限去掉的话,那也去除了使用这个共享目录的用户创建文件, 向文件内写入内容的权限,失去了共享目录的意义.
2. 设置了粘滞位后的目录, 谁能删除目录下的文件?
超级管理员 root, 该目录的拥有者, 该文件的拥有者.