第6章 看家护院——Linux目录及文件权限管理

在Windows系统中使用NTFS文件系统时,可以对目录及文件配置权限使得只有有权限的用户才可以操作目录及文件。在Linux中ext3文件系统同样也支持这样的文件系统权限。在本章中将讲述Linux文件系统权限管理的相关操作。

6.1 Linux目录及文件权限管理方式

Linux系统是一个多用户环境,所以在同一时间可能有多个用户在使用同一个目录或文件。但对每个用户不一定都有相同的权限,也许有的用户可以查看文件、有的用户可以修改文件等,为了满足这样的要求就必须对目录或文件配置权限。

6.1.1 目录及文件的所有者及拥有组

如下所示的内容中有两个“root”,第一个“root”是表明文件的所有者是root用户;第二个“root”是表明文件的拥有组是名为root的用户组。

        [root@srv ~]# ll /etc/fstab
        -rw-r--r--1 root root 912 Jan 29 11:46 /etc/fstab

在默认情况下安装系统时复制到硬盘的系统文件的所有者一般是root用户,拥有组一般是root组。在系统使用过程中文件的所有者是建立文件的用户、拥有组是建立文件用户的初始组。

        [charles@srv ~]$ id
        uid=500(charles) gid=500(charles) groups=500(charles)
        [charles@srv ~]$ touch test
        [charles@srv ~]$ ll test
        -rw-rw-r--1 charles charles 0 Feb 15 04:26 test

6.1.2 目录及文件权限类型

在Linux系统中权限分为可读(r)、可写入(w)、可执行(x)三种。对于文件来说,可读权限表示允许对文件进行浏览;可写入权限表示允许修改文件;可执行表示可以将文件作为命令使用。对于目录来说,可读权限表示允许显示目录列表;可写入表示可以在目录中建立、删除、移动文件或子目录;可执行表示可以切换到目录。

每个目录或文件都有三组不同的读、写、执行权限,分别适用于目录或文件所有者权限、目录或文件拥有组权限、目录或文件其他用户(除了目录或文件所有者以外的用户)权限。当使用“ll”或“ls -l”命令时,第一列会显示目录及文件的权限,该列由10个字母表示。如图6-1所示,这10位中第1位表示文件类型(有关每种文件类型的表示方法见4.2.4);第2~4位表示文件所有者的权限;第5~7位表示文件拥有组的权限;第7~10位表示其他用户权限。如图6-1中名为“jack.docx”的文件其类型为普通文件;文件所有者(root用户)权限为可读、可写入(因为第2~4位是“rw-”,“r”表示有可读权限、“w”表示有可写入权限、“-”表示没有执行权限);文件拥有组(root用户组)权限为可读;其他用户(除了root用户以外的所有用户)权限为可读。

图6-1 目录及文件权限

在Linux系统中除了可以使用r、w、x表示权限以外,也可通过4、2、1三个整数表示权限,其中4表示可读权限、2表示可写入权限、1表示可执行权限。一个用户对目录或文件的权限可用这三个整数相加的值表示,如用户对目录或文件的权限是可读、可执行,那么用数字表示就是5(可读是4、可执行是1)。

在图6-1中“jack.docx”文件的所有者的权限是可读、可写入用数字表示就是6;拥有组的权限是可读、可写入用数字表示就是6;其他用户的权限是可读用数字表示就是4,所以对于“jack.docx”文件整个权限用数字表示就是“664”。

6.1.3 目录及文件权限特性

每一种文件系统在处理自己的目录及文件权限时都会有自己的一些特性,只有充分地了解这些特性后才可以更好地使用权限功能。在Linux使用的ext3文件系统中对目录及文件权限的特性主要包括以下几个。

1.用户有效权限

一个用户对某个目录的有效权限,是该用户自己的权限、用户初始组权限、用户额外组权限之和。在如下内容中,可以发现用户“charles”属于2个组,一个是他的初始组“charles”;一个是他的额外组“test”,文件“lost”拥有组是“test”;文件拥有组权限是可读(r)、可写(w)。用户“charles”对文件“lost”的权限应该就是可读、可写。

        [root@srv tmp]# ll
        total 0
        -rw-rw-r-- 1 root test 0 Feb 15 13:57 lost
        [root@srv tmp]# groups charles
        charles : charles test

2.新建目录默认权限

在RHEL 5.x中默认情况下root用户新建的目录权限是“755”,也就是说目录的所有者root用户权限是可读(r=4)、可写入(w=2)、可执行(r=1);目录的拥有组root用户组权限是可读(r=4)、可执行(r=1);其他用户的权限是可读(r=4)、可执行(r=1)。一般用户新建的目录权限是“775”,也就是说目录的所有者权限是可读(r=4)、可写入(w=2)、可执行(r=1);目录的拥有组权限是可读(r=4)、可写入(w=2)、可执行(r=1);其他用户的权限是可读(r=4)、可执行(r=1)。

● 当前使用root用户。

        [root@srv tmp]# id
        uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

● 建立一个名为“house”的目录。

        [root@srv tmp]# mkdir house

● root用户新建的目录权限是“755”。

        [root@srv tmp]# ll
        total 4
        drwxr-xr-x 2 root root 4096 Feb 15 13:36 house

● 切换到charles用户。

        [root@srv tmp]# su - charles
        [charles@srv ~]$ cd /tmp

● 建立一个名为“olivia”的目录。

        [charles@srv tmp]$ mkdir olivia

● 一般用户新建目录权限是“775”。

        [charles@srv tmp]$ ll
        total 8
        drwxr-xr-x 2 root     root     4096 Feb 15 13:36 house
        drwxrwxr-x 2 charles charles 4096 Feb 15 13:36 olivia

3.新建文件默认权限

在RHEL 5.x中默认情况下root用户新建的文件权限是“644”,也就是说文件的所有者root用户权限是可读(r=4)、可写入(w=2);文件的拥有组root用户组权限是可读(r=4);其他用户的权限是可读(r=4)。一般用户新建的文件权限是“664”,也就是说文件的所有者权限是可读(r=4)、可写入(w=2);文件的拥有组权限是可读(r=4)、可写入(w=2);其他用户的权限是可读(r=4)。

● 当前使用root用户。

        [root@srv tmp]# id
        uid=0(root) gid=0(root)
        groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

● 建立一个名为“weeds”的文件。

        [root@srv tmp]# touch weeds

● root用户新建的文件权限是“644”。

        [root@srv tmp]# ll
        total 0
        -rw-r--r-- 1 root root 0 Feb 15 13:50 weeds

● 切换到charles用户。

        [root@srv tmp]# su - charles
        [charles@srv ~]$ cd /tmp

● 建立一个名为“gossipgirl”的文件。

        [charles@srv tmp]$ touch gossipgirl

● 一般用户新建文件权限是“664”。

        [charles@srv tmp]$ ll
        total 0
        -rw-rw-r-- 1 charles charles 0 Feb 15 13:50 gossipgirl
        -rw-r--r--1 root     root     0 Feb 15 13:50 weeds

提示

新建目录及文件的默认权限是可以修改的。

4.文件拥有者例外

在Linux即便文件的权限中所有者并没有写权限,但只要当前用户是文件所有者一样可以写入文件,如在使用vim编辑这样的文件后保存时只需要使用“!”强制保存即可。在下面的例子中文件jack所有者的权限是只读,但由于当前用户是charles,所以该文件还是可以被写入的。

        [charles@srv tmp]$ id
        uid=500(charles) gid=500(charles) groups=500(charles),512(test)
        [charles@srv tmp]$ ll
        total 0
        -r--r--r--1 charles root 0 Feb 15 17:13 jack

5.符号链接

在RHEL 5.x中建立的符号链接文件的权限都是“777”,也就是说文件的所有者、拥有组、其他用户的权限都是可读(r=4)、可写入(w=2)、可执行(x=1),但符号链接文件的实际权限最后会由其指向的文件决定。

6.用户家目录

在RHEL 5.x中每个用户的家目录的所有者是家目录对应的用户、拥有组是家目录对应用户的初始组;权限是“700”,也就是说只有家目录的所有者有可读(r=4)、可写入(w=2)、可执行(x=1)权限,其他任何用户都没有任何权限。

        [root@srv ~]# ll /home
        total 28
        drwx------4 jack     jack      4096 Feb 14 22:50 jack
        drwx------2 root     root     16384 Jan 29 19:08 lost+found
        drwx------4 oliva    oliva     4096 Feb 14 14:17 oliva
        drwx------7 charles charles  4096 Feb 15 14:13 charles

7.保护子目录

很多时候用户为了让其他用户可以访问某个目录,如用户家目录。给了用户可执行权限,但如果没有给可读权限时(对于目录没有可读权限就不能显示目录列表),其他用户必须事先知道该目录下子目录或文件才可以访问到。因为其他用户不能使用“ls”命令浏览目录中的内容,这样该目录还是保密的,其他用户只访问用户选择公开的部分。

虽然给其他用户可读权限在防止其他用户浏览该目录内容上有一定作用,但这不是非常可靠。因为尽管其他用户只有执行权限,但是其他用户可以猜到该目录中的内容。比如用户家目录下通常会有一个名为“.bashrc”的文件,其他用户在不浏览的情况下也可以查看该文件中的内容。所以在给予其他用户执行权限后,要充分考虑该目录中的文件和子目录的权限。

● 当前用户是oliva。

        [oliva@srv tmp]$ id
        uid=510(oliva) gid=510(oliva) groups=503(user3),504(user4),509(jack),510(oliva)
        [oliva@srv tmp]$ ll
        total 4

● 目录“lost”的所有者是charles,其他用户权限是可执行。

        drwxrwx--x 2 charles charles 4096 Feb 15 14:33 lost

● 用户oliva无法查看lost目录的列表。

        [oliva@srv tmp]$ ll lost/
        ls: lost/: Permission denied

● 但是用户oliva还是可以查看lost目录下有读取权限的文件。

        [oliva@srv tmp]$ cat lost/kate.txt
        Hello world!!!