哈基鹏的Linux系统学习之路(一)
Linux权限管理
一、用户和身份角色
在Linux下,我们可以认为有两种用户:
- root 用户(超级用户):几乎不受权限约束,可以任意访问文件或目录。
- **普通用户:**Linux使用者,受权限约束。
创建用户:
adduser [用户名]设置密码:
passwd [用户名]切换用户:
su [用户名]切换到root用户:
su回退到之前用户:
ctrl+D或exit以root身份重新登录:
su-指令提权:
sudo 指令,本质上是以root用户的身份执行命令
而“身份角色”是针对于具体事物,由用户所扮演的。身份角色有如下三种:
- 文件拥有者(User,u)
- 文件所属组(Group,g)
- 其他人(Other,o)
对于一个目录或文件而言,身份角色不同,它们所拥有的权限也不尽相同,其权限由文件属性和身份角色共同决定。
二、文件属性
1.文件属性表示
使用 ls -l 指令显示文件信息,就可以看到文件属性:

例如上图中的code文件,它的各项属性表示如下:

接下来,我们重点探讨一下文件类型以及权限属性。
第1位:文件类型
- d:目录
- -:普通文件
- c:字符设备文件
- b:块设备文件
- p:管道文件
- l:软链接文件
- s:套接口文件
第2~10位:文件的权限属性
如上图所示,文件的权限属性针对三种角色可能有所不同,这就说明权限**由文件属性和身份角色共同决定。**权限类型有三种:
- r:可读–可以查看文件内容
- w:可写–可以修改文件内容
- x:可执行–可以运行
当权限属性的相应位置上有r/w/x时,表示该文件针对的角色具有读/写/执行该文件的权限,否则不具有相应权限。
以下两点需要注意:
- 对于root用户,无论其扮演的角色是否具有权限,其都可以进行相应操作。
- 一个文件可执行的两个必要条件:1. 文件具备可执行权限;2. 文件的类型是可执行程序。
权限类型有字符表示方法和八进制表示方法两种**:**

当使用八进制表示方法表示权限属性时,一种角色的权限属性可以只用一位八进制数字表示,所以一个三位八进制数字就可以表示全部角色的权限属性(修改权限属性时方便使用)。
注意:针对某个文件来讲,一个扮演多种角色的用户的权限按照角色优先级进行对应。
角色优先级:拥有者>所属组>其他人
三、修改文件的权限属性和角色
1.修改权限属性
我们可以使用chmod指令修改一个目录或文件的权限属性。它的语法如下:
1 | chmod 选项 权限 文件名 |
常用选项:-R 递归地修改目录及子目录的权限
其中,若使用字符表示法表示权限,则其格式是:(角色)(+/-)(r/w/x)
角色:
- u:表示拥有者
- g:表示所属组
- o:表示其他人
- a:表示所有角色
+/-
- +:表示新增权限
- -:表示去除权限
使用示例:
1 | chmod u+r test.txt |
当然我们也可以使用八进制表示方法设置文件权限。使用示例:
1 | chmod 777 test.txt |
注意:只有文件的拥有者或具有root权限才能修改和设置文件的权限属性。
2.修改文件角色
除了文件的权限属性,文件角色也可以被修改。
chown指令修改文件拥有者:
1 | chown 用户名 文件名 |
使用示例:
1 | chown user test.txt |
chgrp指令修改文件所属组:
1 | chgrp 用户名 文件名 |
使用示例:
1 | chgrp user test.txt |
注意:只有具有root权限才能修改文件拥有者;只有文件的拥有者或具有root权限才可以修改该文件所属组。
四、关于权限的三个问题
1. 目录的权限
对于一个目录而言:
如果没有读权限,就无法查看该目录下的文件信息;
如果没有写权限,那么就无法创建、删除、修改该目录内部的文件;
如果没有执行权限,那么无法进入该目录。
**注意:**即使一个目录有读权限,但若没有执行权限,那么仍然无法进入该目录,并且无法在该目录下执行命令和查看该目录下文件的详细信息。
2. 默认权限与实际权限
在Linux下,一个普通文件,它的默认权限是rw- rw- rw-(666);而一个目录的默认权限是rwx rwx rwx(777)。
但当我们创建一个普通文件和目录后,可以看到其权限属性并非是默认值:

相比默认权限,两者的实际权限貌似缺失了所属组和其他人的读权限。这是为什么呢?
实际上,存在一种叫做umask权限掩码的机制,它控制的是新创建文件和目录时,哪些权限将被去除。注意:它并不会直接赋予权限,而是通过限制默认权限来间接设定权限。

可以使用umask指令查看umask码:

可以看到,当前系统的umask为022(最高位的0暂且省略),它其实是一个三位八进制数字,与八进制数字表示的权限属性相呼应。
掩码规则:文件的实际权限 = 默认权限(八进制)- umask
所以我们看到的文件和目录的实际权限是:
目录:777 - 022 = 755 (rwx r-x -r-x)
文件:666 - 022 = 644 (rw- r– r–)
当然,umask也可支持修改,使用示例如下:
1 | umask 002 #将umask修改为002 |
修改umask,可以达到修改实际权限的效果。
3.删除权限与粘滞位
要删除一个文件,看的不是该文件的读/写/执行权限,而是需要该文件所在目录的写权限和执行权限,因为执行权限决定了是否可以进入目录;写权限决定了是否可以删除目录下文件。
但这种设定似乎并不合理:假设有一个用户,其无权访问文件A,但可能有权删除文件A。
所以Linux出现了一种机制:粘滞位,用于防止无关人员删除重要文件。
当一个目录被设置为粘滞位后,其下的文件或目录只能由以下两者删除:
1. root用户
2. 当前文件或目录的所有者
也就是说,除了root用户之外,该目录下的文件或目录,只有自己的,才能被自己删除。
设置粘滞位的指令:
1 | chmod +t 目录名 |
总结:如果想要共享一个目录,并且确保目录下的文件不被删除,那么就需要设置粘滞位。
有两点需要注意:
1. 根目录下的tmp目录自带粘滞位,可以用做共享目录。
2. 粘滞位只需给目录设置,不需要给普通文件设置。





