Linux基础:权限与文件

用户与用户组

Linux 是一个多用户、多任务的系统,常常有多人同时使用一台机工作,为了保护每个人的隐私权,“文件所有者”的角色就显得相当重要了。

当Linux用户登录系统之后,就会携带一个用户身份(User ID,UID)和一个用户组身份(Group ID,GID),相当于自己的名片。当需要访问文件或程序时,刷一下名片就能知道是否能读、写、执行了。

一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/etc/group中,文件的每一行代表一个用户/组。早期的Linux将密码以明文的形式保存在/etc/passwd中,而现在则多以暗码(也就是加密之后的形式)的形式保存在/etc/shadow中。将密码存储在/etc/shadow中提高了密码的安全性,因为/etc/passwd允许所有人查看,而/etc/shadow只允许root用户查看。

文件属性

要了解Linux的权限控制就必须学习Linux的文件权限和属性。可以用ls命令查询文件信息($ls -l),得到如下结果:

$ ls -l  ~/input
总用量 36
drwxrwxr-x 2 wuchong wuchong 4096 7 10 21:45 ./
drwxr-xr-x 30 wuchong wuchong 4096 7 12 08:58 ../
-rw-rw-r-- 1 wuchong wuchong 46 6 16 20:31 a.txt
lrwxrwxrwx 1 wuchong wuchong 4 6 16 16:03 b.txt -> a.txt
[ 权限 ][连接数][拥有者][用户组][文件容量][ 修改日期 ] [文件名]

我们以 a.txt 文件为例介绍各个部分的含义:

  1. 第一列代表文件权限。它由十个字符组成。首先介绍第一个字符的-,它表示文件类型,说明 a.txt 是常规文件(如果是目录文件则应显示 d,如果是 l 则是软链接文件)。随后有九个字符,为rw-rw-r--,它们用于表示文件权限。这九个字符分为三组,rw-,rw-, r--,分别对应拥有者(owner),所属用户组(owner group)和所有其他人(other)。回顾 Linux 的启动流程,登录后,我们会有一个用户身份和一个组身份, 相当于我的身份证。第一组表示,如果我的身份证上的用户身份证明我是该文件的拥有者,那么我就可以对该文件有读取(r),写入(w)该文件的权限,但不拥有执行(x)该文件的权限。如果不拥有某项权限,会在对应的位置上出现减号(-)。第二组表示,如果我的名片上的组身份证明我所在的组是该文件的所属用户组的一员,那么我有从该文件读入和写入的权限。第三组表示,如果我的名片显示我既不是拥有者,也不是拥有组的一员,那么我只有读入的权限。当我想要进行一个读取操作时,Linux会先看我是否是拥有者。
  2. 第二列代表有多少文件名连接到此节点(i-node)。每个文件都将它的权限和属性记录到文件系统的 inode 中,不过文件名却是存放在目录文件中的。因此会有多个文件名连接到一个 inode 的情况,这就是硬链接,而该列就是指的硬链接数。
  3. 第三列表示这个文件(或目录)的拥有者。
  4. 第四列表示这个文件(或目录)的所属用户组。
  5. 第五列表示这个文件的大小,单位为字节(byte)。其中软链接文件(上面的 b.txt 文件)的大小正好是目标文件的字符数。至于目录也是一种文件,有趣的是大部分目录所占的大小都是 1K、2K、4K 的倍数。
  6. 第六列表示文件的最近修改时间。其实文件属性中还包括创建时间和最近读取时间,只是并未显示出来。
  7. 第七列为该文件的文件名。

改变文件属性和权限

我们已经知道文件权限对于一个系统的重要性了,但如何对文件的属性和权限进行修改呢?这里主要用到三个命令:chgrpchownchmod,分别对应修改用户组、拥有者和文件权限。

  • 改变所属用户组:chgrp

    $ chgrp 组名  文件或目录
    $ chgrp users a.txt
  • 改变文件所有者:chown

    $ chown 账号名称 文件或目录
    $ chown 账号名称:组名 文件或目录
    $ chown root:root a.txt
  • 改变文件权限:chmod
    Linux中的每种身份(own、group、other)拥有一个权限三元组(rwx)。每一个权限组可以用一个三位的二进制来表示,拥有对应权限的则在相应位上置1。例如-rw-rw-r--即代表 664 的意思。如果我们想将该文件改成-rwxrwx---的权限,就将其权限分数改成 770 即可。

    $ chmod 770 a.txt
    $ ls -l a.txt
    -rwxrwx--- 1 root root 46 6 16 20:31 a.txt

默认权限umask

当我们创建文件的时候,比如使用touch,它会尝试将新建文件创建为权限666,也就是 rw-rw-rw-。但操作系统要参照权限 mask 来看是否真正将文件创建为666。权限 mask 表示操作系统不允许设置的权限位,比如说037(—-wxrwx)的权限 mask 意味着不允许设置设置 group 的 wx 位和 other 的 rwx 位。如果是这个权限 mask 的话,最终的文件权限是 rw-r—– ( group 的 w 位和 other 的 rw 位被 mask )。

我们可以通过

$umask 022

的方式改变权限mask。仅输入umask是查询默认 mask 的意思。

总结

Linux 中的权限管理非常复杂,尤其是涉及进程的时候,有时会有权限的切换。这部分待到以后再说。不过Linux的权限管理都是基于文件的属性和权限的,因此学习了解 Linux 的文件系统非常重要。

参考资料