Linux 系统中,用户分为三种:文件拥有者 (User/Owner),群组 (Group),其它人 (Others),对同一个文件/文件夹,不用的身份的用户对于文件的权限也不同。本文将从这三类用户出发,介绍他们的特点和Linux文件权限。


一、使用者与群组

初次接触 Linux,随便随表敲敲命令,有时候就会出现错误:Permission deny,这就是出现了文件权限不够的情况。而要了解文件权限,我们先从 Linux 的三类用户说起。

1.1 文件拥有者(User/Owner)

文件拥有者就是创建了文件的那个用户,由于Linux是个多人多任务的系统,因此可能常常会有多人同时使用这部主机来进行工作的情况发生。

如果你在主机里存了一封准备发送给你喜欢的女生的情书,你当然不希望别人偷看啦,这个时候你可以把文件权限设为只有文件拥有者,也就是你才可以 Read / Write 这个文件,就可以保证别人都看不到它了。


1.2 群组(Group)

群组在团队开发中扮演者非常重要的角色。举个例子:

宋兵甲,炮灰乙两个人需要一起开发同一项目 Project1,则可以让他们两人都加入一个群组 Group1,然后 Project1 的文件权限为 Group1 的成员开放;流氓丙,土匪丁两个人一起开发项目 Project2,让他们两个人加入同一群组 Group2,然后 Project2 的文件权限为 Group2 的成员开放。

这个时候,Group1,Group2 仅仅能够访问自己的 Project,没法去别人的项目那里捣乱,整个开发井井有条。而你是上帝,你需要同时监控两组项目的情况,这时候你可以同时加入 Group1 和 Group2,这样的话两个项目都对你开放了。


1.3 其它人(Others)

任何不是文件拥有着和不在文件群组里的用户都叫做 “其它人”,从上面的例子来说,流氓丙对于 Project1 来说,就是个“其它人”。一般来说,其它人对于一个文件所拥有的权限是最低的。


做一个类比:

假设你有个室友,你和他住在同一个房子的两个房间里,你拥有你的房间,即使是你的哥哥,他也不能随随便便进来翻你的抽屉,因为你是这个房间的拥有者

你和室友共用同一个客厅,你们都可以跑到客厅里看个电视,在冰箱里拿拿饮料喝水,这个时候,你和哥哥组成一个群组,你们共同享有客厅。

最后,大街上的那些其它人,别说到你的房间来了,就连客厅都进不来。除非他和你或者你舍友成了好朋友,加入你们的群组,否则永远进不了你们房子的门。


1.4 root

当然,Linux 系统中,真的有一个上帝般的存在,它就是 root,他可以到达任何他想要去的地方,看到任何想看的东西,包括你昨晚写的那封情书~ 通常情况下,我们可以用 sudo 指令 来执行一些 root 命令。


二、文件权限

首先我们要了解一个指令: ls,这个指令表示查看目录下的所有非隐藏文件。我们键入 ls -al 查看目录下文件的详细信息:

-rwxr-xr-- 1 qyb225 qyb225 42304 10月 11 21:12 A.txt
-rwxr-xr-- 1 qyb225 qyb225  1024 10月 11 21:12 B.txt

2.1 查看权限

我们取任意一行来讲解:

-rwxrw-r-- 1 qyb225 qyb225    0 10月 11 21:12 A.txt

-rwxr-xr--: 这 10 个字符表示的是文件权限。

其它的字段依次向后表示:连接数,文件拥有着,群组,文件大小,最后修改日期,文件名。

再把表示权限的十个字符分为 1 + 3 + 3 + 3 四段:

- | rwx | r-x | r--
  1. 只有一个字符的第一段表示档案类型
  2. 第二段表示文件拥有者所拥有的权限
  3. 第三段表示文件群组拥有的权限
  4. 第四段表示其它人所拥有的权限

每段的三个位置分别对应了按照 rwx 排列的三个权限:

  • r: read 读权限
  • w: write 写权限
  • x: 执行文件权限

如果该位置字段为 ’-‘, 则该类用户无此权限。还是以上面的 -rwxr-xr-- 为例:

忽略第一个 - ,我们看到三类用户分别对应:

用户 权限字符 权限
文件拥有者 rwx 有读、写、执行权限
群组 r-x 有读、执行权限,无写权限
其它人 r-- 有读权限,无写、执行权限

2.2 改变文件属性与权限

我们知道文件权限对于一个系统的安全重要性,也知道文件的权限对于使用者与群组的相关性, 那么如何修改一个文件的属性与权限呢?

我们先介绍几个常用于群组、拥有者、各种身份的权限之修改的指令,如下所示:

  • chgrp:改变文件所属群组
  • chown:改变文件拥有者
  • chmod:改变文件的权限, SUID, SGID, SBIT等等的特性

2.2.1 chgrp

改变群组很简单,只需要 chgrp 命令即可,也就是 change group 的简写。注意你将修改的群组必须在 /etc/group 文件中。

//命令:
$ chgrp [-R] group_name file_name

//示例:
$ sudo chgrp users A.txt
$ ls -l
总用量 0
-rwxr-xr-- 1 qyb225 users  0 10月 11 21:12 A.txt
-rwxr-xr-- 1 qyb225 qyb225 0 10月 11 21:12 B.txt

2.2.2 chown

改变文件拥有者和改变群组几乎相同,命令式 chown,也就是 change owner 的简写。要注意的是, 用户必须是已经存在系统中的账号,也就是在 /etc/passwd 这个文件中有纪录的用户名称才能改变。

//命令:
$ chown [-R] user_name file_name

//示例:
$ sudo chown bin A.txt
$ ls -l
总用量 0
-rwxr-xr-- 1 bin    users  0 10月 11 21:12 A.txt
-rwxr-xr-- 1 qyb225 qyb225 0 10月 11 21:12 B.txt

探讨一个小问题,改变文件的拥有者和群组到底有什么用呢?比如一个用处就是在复制文件的时候:比如你想把一个文件复制给 bin 这个使用者,但是复制出的文件的拥有者是你自己,这样 bin 就可能没法查看修改文件,这个时候就需要改一下文件拥有者啦。


2.2.3 chmod

chmod 用于改变文件的权限,共有两种方式。

(1) 数字类型改变权限

在数字类型中,r, w, x 三个字母分别对应了数字 4, 2, 1

然后拿出三类用户的权限,假设分别为 rwx, r-x, r–。只需要将对应的数字加起来即可:

  • rwx = 4 + 2 + 1 = 7
  • r-x = 4 + 0 + 1 = 5
  • r-- = 4 + 0 + 0 = 4

所以 rwxr-xr-- 的数字表示为:754

根据这个修改文件权限,比如想把 A.txt 的文件权限修改为 rwxrwxr-x:

$ sudo chmod 775 A.txt
$ ls -l
总用量 0
-rwxrwxr-x 1 bin    users  0 10月 11 21:12 A.txt
-rwxr-xr-- 1 qyb225 qyb225 0 10月 11 21:12 B.txt


(2) 符号类型改变权限

符号类型修改方法用 u(User), g(Group), o(Others) 三个字母表示文件拥有着,群组和其它人。根据不用的命令,使用 +, -, = 来为不同的用户增加 / 删除 / 修改权限。

$ sudo chmod ugo=wrx A.txt
$ ls -l
总用量 0
-rwxrwxrwx 1 bin    users  0 10月 11 21:12 A.txt
-rw-rw-r-- 1 qyb225 qyb225 0 10月 11 21:12 B.txt

$ sudo chmod g-w,o-wx A.txt
$ ls -l
总用量 0
-rwxr-xr-- 1 bin    users  0 10月 11 21:12 A.txt
-rwxr-xr-- 1 qyb225 qyb225 0 10月 11 21:12 B.txt

$ sudo chmod g+w,o+x B.txt
$ ls -l
总用量 0
-rwxr-xr-- 1 bin    users  0 10月 11 21:12 A.txt
-rwxrwxr-x 1 qyb225 qyb225 0 10月 11 21:12 B.txt