Linux我用 LinuxLinux学习|Gentoo/Arch/FreeBSD

说说Linux文件权限那些事儿

2019-11-30  本文已影响0人  退休码农飞伯德
图片来自互联网

首先我们要知道Linux的标准文件权限和安全机制与Unix的一致,因此要学习这方面的知识,我们可以参考一下Unix方面的书籍。

文件所有权

在Linux系统中,一切都是文件。因此文件既包含普通文件也包含目录,下文也就不再区分文件和目录了。说到Linux文件权限(permission),我们不得不先说说文件的所有权问题。在Linux系统中,文件有两个所有者:用户所有者(u)和组所有者(g)。文件的组所有者独立于拥有该文件的用户,也就是说
大多数情况下,文件所有者所在的用户组就是文件的组所有者,但这不是必须的。文件的用户所有者不一定属于文件的组所有者,这两者之间没有什么必然的联系。所以如果你赋予文件的组所有者某个权限,并不会同时赋予给用户所有者。如果想要实现此功能,最佳的方法就是将用户所有者添加到组所有者的成员中。

显示文件的所有权

使用ls -l可以显示文件的用户和组所有者:

    $ ls -l
    drwxr-xr-x 5 sun family  4096 Mar  4 11:33 dir2
    drwxr-xr-x 3 sun family  4096 Mar  4 11:40 dir3
    -rw-r--r-- 1 sun family   711 Mar  4 11:21 exp
    -rwxr-xr-x 1 sun family  5189 Mar  5 08:20 feb

更改文件的所有权

如果要更改文件到的所有权,可以使用chownchgrp命令。chown(大多数情况下,只能使用root用户使用)可以更改一个或多个文件的用户所有者:

    # chown sun hello.c

chgrp则可以用来修改文件或目录属于的用户组。

文件的权限

Linux对于文件的权限设置其实是很好理解的。拥有r权限,便可以读取文件,查看文件的内容;拥有w权限,便可以更改文件的内容;拥有x权限,而且该文件是二进制可执行文件那么就可以执行该文件。

但是对于目录的话,就没有那么好理解了。如果用户拥有某目录的执行(x)权限,那么他就可以cd到该目录;如果要列出该目录下的文件(也就是使用ls命令),那么就必须要有对目录的读(r)权限。如果您只需要访问该目录,那么您只需要对该目录有x权限就够了。有一点需要强调的是,如果你使用ls -l命令显示目录下的文件的详细信息,但是你此时对该目录并没有执行权限,那么你将得到如下的结果:

    ?--------- ? ? ? ?            ? hello.c
    ?--------- ? ? ? ?            ? deb.txt
    ?--------- ? ? ? ?            ? strip.c

你会发现结果中只显示了文件的名字,其他信息基本都是?。其实这是因为文件的大小等信息需要从磁盘信息中才能判断出来,因此必须具有对目录的执行(x)权限,才能使-l选项真正发挥效果。

另外还有一点需要注意,删除文件不需要对文件具有写入(w)权限,只需要对该目录具有写入(w)权限即可,但是在这种情况下,系统会提示你是否要覆盖对文件的写保护设置。

修改文件的权限

要修改文件的权限,可以使用chmod命令,注意不要与chown(修改文件的所有者)混淆。其实我们可以这样区分:chown其实是“change owner”(改变主人)的简写,而chmod其实是“change mode”
(改变(访问)模式)的简写。

用符号表示法修改

要添加(使用“+”)用户所有者的写权限可以这样:

    $ chmod u+w hello.c

要剥夺(使用“-”)组所有者的读权限可以这样:

    $ chmod g-r hello.c

要设置用户所有者具有特定的权限可以使用“=”:

    $ chmod u=rw hello.c

PS:需要说明的是,这里u代表用户所有者,g代表组所有者,o代表其他用户,a代表所有用户。

用数字表示法修改

在使用之前我们需要先理解一下数字表示法的原理。在数字表示法中,根据每种权限是否被许可,将其设置为0或1,并将得到的三位二进制数转换为八进制数。将这三个八进制数组合在一起便是该文件权限的数字表示。其中r对应的权值为4,w对应的权值为2,x对应的权值为1.

用户 其他
权限 r w x r - x r - -
二进制 1 1 1 1 0 1 1 0 0
八进制 7 5 4
数字表示法 7 5 4

看完这个表格我想你应该大致明白了,数字表示法的基本原理,下面让我们具体操作一下:

    $ chmod 754 hello.c

数字表示法和符号表示法各有优劣,前者使用起来更加简洁,执行一条命令就可以完成我们想要的结果,缺点是这种表示法不直观令人费解;而后者很直白,通俗易懂,但是执行起来效率不高,往往需要运行几条命令才能达到我们要的结果(如果你想要的结果复杂的话)。

使用umask指定默认的文件权限

讲完数字表示法,我们不得不提一下Linux文件管理中的一个重要的命令——umask命令。根据维基百科上的说法,umask是一串二进制码,使文件创建时权限具有一个初始值。其中曾这样做比喻,mask码就相当于一个最后的过滤器,每当文件创建时就剥除文件相应的权限。每当你创建了一个文件,系统会根据umask码自动为你设置文件的权限。当某个权限的二进制值为1时表示禁止该权限。举个例子来说,假如umask码为0022,在这里只有后三位022是我们所需要的,第一位是为特殊权限设置,我们暂不讨论。当你创建目录exa时,系统中便会这样计算该目录的权限:777-022=755。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来 说,umask中各个数字最大可以到7。

    $ umask
    0022
    $ mkdir example
    $ ls -ld example/
    drwxr-xr-x 2 2014012537 xg+jsj14 4096 Mar 12 12:02 example/

参考文献

  1. Robert Love.Linux系统编程,2014,5.人民邮电出版社
  2. Scott Grannerman.Linux命令速查手册,2009.10.人民邮电出版社
  3. Aeleen Friscb.Unix与Linux系统管理,2006.11.清华大学出版社
  4. 维基百科-umask.https://en.wikipedia.org/wiki/Umask
  5. umask命令的作用
上一篇下一篇

猜你喜欢

热点阅读