权限是对人的行为的一种限制和规范,为了维护某种秩序,而限制某人能做某事和不能做某事。例如一位名叫张三的校长可以随意进出校长办公室——这位校长能够随意进出校长办公室,并不是因为他姓甚名谁,而是因为他的校长身份;校长办公室是不能随意进出的,只有特定身份的人才能随意进出,可以说,这是“校长办公室”这样事物的属性。也就是说,“权限 = 人的身份 + 事物的属性”。
为了保证操作系统的稳定性、安全性、高效性,Linux也引入了权限的概念,以限制和规范用户在Linux上的操作。人有身份意味着对人进行了归类,事物有属性也意味着对事物进行了归类。Linux中的操作,基本上是用户对文件的操作,所以Linux对文件访问者的身份进行了归类(用户是文件访问者的名字),对文件也进行了归类。
本篇博客详细整理了Linux中用户和文件、文件访问者的相关知识,旨在帮助读者更好地理解Linux权限一事。
目录
一、用户与用户权限
1.用户的分类
在Linux中用户被分为两类:
- 超级用户:也叫root用户,拥有管理员权限(Linux下最高权限),在Linux下不受限制,所有的操作它都可以做。所以超级用户有且只有一个。
- 普通用户:由于权限的限制,Linux下普通用户只能做有限的操作。但普通用户可以有多个。
除了权限不同外,超级用户跟普通用户最直观的区别其实是,超级用户的命令提示符是 # ,普通用户的命令提示符是 $ 。
另外,超级用户账号在根目录的root目录下,而普通用户账号在根目录的home(家)目录下,每个普通用户账号都有一个属于自己的目录,目录的名字就是用户名。
2.用户的管理
由于本系列博客是通过云服务器来搭建Linux环境的,所以直接使用公网IP和密码登录的就是超级用户,而通过用户名和密码登录的是普通用户。普通用户的增删是在超级用户下进行的(相关指令操作详见:【Linux入门】Linux简史-CSDN博客)。
3.用户的切换
由于用户的分类,用户的切换可以有:普通用户切换成超级用户、超级用户切换成普通用户、普通用户A切换成普通用户B,这个过程是通过指令su来完成的。
· 进行用户之间的切换:su
语法:su + (选项)
【补】选项:
- 用户名:切换成指定的用户(但只是切换了用户身份,并不改变当前工作目录)。从超级用户切换为普通用户时、从普通用户A切换为普通用户B时必须指定用户名,而从普通用户切换成超级用户时可以省略用户名root
- - + 用户名:以登入的方式切换,既切换身份也切换当前工作目录
=====================================================================
· 对普通用户暂时提权:sudo
语法:sudo + 指令
在普通用户下输入“sudo + 指令”,可以不进行用户切换,就让普通用户在输入下一条指令时暂时拥有超级用户的权限(但前提是这个普通用户在系统白名单中,且输入“sudo+指令”后需输入这个普通用户的密码)。
3.1 普通用户 —> 超级用户
如果要从普通用户切换成超级用户,只需输入“su”并按下回车,接着输入超级用户的密码并按下回车(输入的密码不回显。注:su指令只是切换了用户的身份,但不会改变当前工作目录,要改变当前工作路径可以输入“su -”)。
1
2
如果只是某一条指令需要以超级用户的权限来执行,就可以输入“sudo 指令”对普通用户进行短暂的提权,来完成这条指令(但前提是这个普通用户在系统白名单中)。
3.2 超级用户 —> 普通用户
如果是普通用户切换至超级用户,想切换回普通用户了,可以输入“exit”或按下热键“ctrl + d”即可。
如果只是超级用户想切换成任意一个普通用户,在超级用户下输入“su 普通用户名”,就可以切换成任意一个普通用户,无需输入任何密码(但切换后,当前工作目录并不改变。只有输入“su - 普通用户名,既切换身份也切换工作目录)。
1
2
3.3 普通用户A —> 普通用户B
要从普通用户A切换到普通用户B,只需输入“su 普通用户B”,然后输入普通用户B的密码即可(与上文类似的,既要切换身份又要切换工作目录,就得输入“su - 普通用户B”)。
二、文件与文件权限
1.文件的分类
Linux系统本身不通过文件的后缀来区分文件的类型,而是通过字符来区分文件类型(但在Linux系统上运行的软件会通过后缀来区分类型)。例如指令ls -l可以查看到文件的更多信息,其中就包含了区分文件类型的字符。
Linux系统中主要有以下几种文件类型:
- -:普通文件(文本文件、源代码、二进制文件、压缩文件)
- d:目录文件
- b:块设备文件(磁盘)
- c:字符设备文件(键盘、显示器)
- p:管道文件(用于通信)
- s:套接字文件(用于网络数据连接)
- l:链接文件
2.文件的访问权限
文件的访问权限也是通过字符来区分的,也可以通过指令ls -l看到。一个文件的权限一共有九位字符来表示,每一位分别由r、w、x、- 占位。
- r:读权限(对普通文件而言,具有读取文件内容的权限;对目录文件而言,具有浏览目录信息的权限)
- w:写权限(对普通文件而言,具有修改文件内容的权限;对目录文件而言,具有删除、移动目录文件的权限)
- x:可执行权限(对普通文件而言,具有执行该文件的权限;对目录文件而言,具有进入目录的权限)
- -:对应位置没有权限。
而每一组权限的字符组合又有:
【补】 访问权限的每种组合的八进制和二进制表示方法
为什么文件的访问权限分为三组呢?这与文件访问者的身份有关。
3.文件访问者的身份
Linux下文件访问者的身份有三种,分别对应文件的三组访问权限。
- User - 文件和目录的拥有者(也就是文件和目录的创建者)
- Group - 拥有者所属的用户组(简称所属组,为了实现多个用户的组内协同)
- Others - 其他人
例如某人创建了一个文件,此时ta就是这个文件的拥有者。当ta和另一个人分享了这个文件,那另一个人就在这个文件的所属组中了,相当于拥有者跟另一个人发起了一个群聊。如果又有人想访问这个文件,那ta就算作其他人。其中,拥有者对应第一组权限(第一位到第三位),所属组对应第二组权限(第四位到第六位),其他人对应第三组权限(第七位到第九位)。
但注意,文件访问者的身份不等同于用户。文件的访问者一定是用户,用户相当于是访问者的名字,当用户访问文件时,用户有一个访问文件的身份。比如说,文件的访问者是一个普通用户,这个用户可以是文件的拥有者、所属组或其他人,同理,超级用户也可以是文件的拥有者、所属组或其他人(但实际上超级用户不受任何权限的限制)。
一个文件的拥有者是谁,所属组是谁,也可以通过指令ls -l查看。
(ps:当拥有者与所属组相同时,优先使用拥有者的权限)
4.访问权限的改写
要改写访问权限,一般涉及改写文件权限本身和改写文件访问者的身份,可以通过chmod、chown、chgrp三个指令来完成。
· 改写文件权限:chmod
要用chmod改写文件权限,用户的身份必须是文件的拥有者,或者用户自己是超级用户。
语法:chmod + (选项)+ 指定权限 +文件名/路径
【补】选项:
- -R:递归修改目录文件的权限
【补】指定权限:
语法一:用户表示符 + “+/ - / =” + 权限字符 —— 某身份增/删/获得某权限
1)用户表示符:
- u:拥有者
- g:所属组
- o:其他人
- a:所有用户(包括拥有者、所属组、其他人)
2)“+/ - / =”:
- +:增加权限
- -:删除权限
- =:获得权限
1
2
3
语法二:三位八进制数字 —— 某身份拥有某些权限
对于每一组权限中的三个权限位,可以用1来占位表示某一位有对应的权限,用0来占位表示某一位没有对应的权限,如此,每一组权限就不再是字符组合,而是一个0和1的二进制数组合。例如 111 表示某一身份拥有读、写、可执行的全部权限;010 则表示某一角色只有写权限,而没有读权限和可执行权限。而每一个二进制数组合又可以用一个八进制数字来表示,例如111对应的八进制是7,010对应的八进制是2。
如此,每种身份的权限都可以只用一个八进制数字来表示,形式上简洁了不少。
【Tips】读权限r为4,写权限w为2,可执行权限x为1,其他权限组合都是4、2、1分别相加起来,例如读写权限 rw- 为6(4+2),读写可执行 rwx 权限为7(4+2+1)。
· 改写拥有者:chown
指令chown可以改写文件拥有者,一般在超级用户下进行,例如普通用户A要将自己的文件转让给普通用户B,必须由超级用户来协调完成,不能由普通用户A与普通用户B私下完成。
要拿别人的东西应当先经过别人的同意,同理的,修改文件的拥有者,相当于用户B拿到了用户A的文件,那么就需要用户B先征得用户A的同意,所以一般不允许普通用户A与普通用户B私下改写拥有者,而要由超级用户(管理员)协调改写。
语法:chown +(选项)+ 用户名 + 文件名/路径
【补】选项:
- -R:递归修改目录文件的拥有者
1
2
· 改写所属组:chgrp
改写所属组同样要由由超级用户来协调完成。
语法:chgrp +(选项)+ 用户名 + 文件名/路径
【补】选项:
- -R:递归修改目录文件的所属组
1
2
5.权限掩码
Linux中,每个类型的文件在创建之初都会被赋予默认的初始权限。其中,普通文件的初始权限是666(三种身份都可读可写),目录文件的初始权限是777(三种身份都可读可写可执行)。
然而,当超级用户创建一个普通文件,会发现它的权限其实是644(拥有者可读可写,所属组、其他人只可读)并非初始的666;创建一个目录文件,会发现它的权限是755(拥有者可读可写可执行,所属组、其他人可读可执行),并非初始的777。
“普通文件的初始权限是666”和“目录文件的初始权限是777”本身没错,我们看到的权限其实不是初始权限,而是经过权限掩码过滤之后的最终权限。
【Tips】最终权限 = 初始权限 & (~权限掩码)
更直观地说:最终权限 = 初始权限 - 权限掩码
为了更好地控制文件的访问权限,Linux系统引入了权限掩码。超级用户下默认的掩码值为0022(默认所属组和其他人没有写权限),普通用户默认为0002(默认其他人没有写权限),而指令umask可以用来查看或修改文件的权限掩码。
· 查看或修改权限掩码:umask
语法:umask +(选项)
【补】选项:
- (不加):查看当前用户的权限掩码
- 掩码值:修改当前用户的选项掩码
如果文件的拥有者希望所属组和其他人拥有更多的权限或更少的权限,可以输入“umask 掩码值” 来做到这一点。例如输入“umask 0055”,让所属组和其他人只拥有普通文件的可执行权限。
6.目录权限问题和粘滞位
目录文件的权限同样也有读、写、可执行。
- 读权限r:是否允许用户查看目录下的文件内容
- 写权限w:是否允许用户在目录下增删改
- 可执行权限x:是否允许用户进入目录
- 特别的,存普通用户账号的家目录/home的权限是700,也就是说,只允许文件拥有者(即账号本人)和超级用户对普通用户账号进行操作
有时,多个用户需要进行文件数据的共享,来对同一个目录下的文件进行操作。然而家目录的特性就导致这个由多个用户之间共享的目录不能在任何一个用户的账号下,所以,这个共享目录基本上是通过超级用户来操作,创建在根目录下的(根目录的拥有者和所属组都是超级用户,普通用户作为其他人并没有写权限,所以必须由超级用户来创建;另外,在根目录下的文件,是可以直接被超级用户和普通用户访问到的,这是因为在目录的树结构中,每个目录都可以向上追溯到根目录),而参与这个共享文件操作的普通用户们都以其他人的身份去操作这个共享文件(因此,还需要把共享目录的其他人权限设置为最高的7,确保普通用户不仅可以进入共享目录,还可以在目录下增删改查)。
但这样做会引发一个问题。
按理来说,要删除一个目录下的普通文件,就需要做删除操作的用户的身份拥有这个普通文件的写权限,然而现状是,只要用户的身份拥有目录的写权限,就可以删除目录中的任意一个普通文件,且不管这个用户的身份是否拥有这个普通文件的写权限,这显然是不合理的。
为了解决这个不合理的问题,Linux引入了粘滞位。
粘滞位是一种特殊的可执行权限,用字符 t 来表示。为共享目录的其他人身份设置粘滞位后,就只允许目录的拥有者、目录下文件的拥有者和超级用户删除目录下的文件了,而其他人无法删除目录下的任何文件。粘滞位只能设置给目录文件,也只能设置给其他人身份,在超级用户下输入“chmod o+t 文件名”或“chmod +t 文件名”,即可为共享目录的其他人身份设置粘滞位权限。
另外,系统其实已经在根目录下提供过一个共享目录了。