Last Updated on

对于多用户,多任务的Linux来说,文件和目录的权限管理非常重要。在Linux中目录是一种特殊的文件,这里将文件和目录统称为文件。

文件权限就是指对文件的访问控制,决定哪些用户,哪些组对文件具有哪种访问权限。

Linux将文件访问者身份分为3个类别:

  • 所有者owner
  • 所属组group
  • 其他用户others

然后将访问权限,也分为3种:

  • 读read
  • 写write
  • 执行execute

那么对文件权限管理,就包括这两个方面,即文件的访问者身份和不同身份对文件的访问权限。

1. 访问者身份

访问者身份分为上面的三种,所有者,所属组,其他用户,下面我们依次来简单说一下,

(1)所有者

每个文件都有它的所有者,默认情况下,文件的创建者即为其所有者,所有者对文件具有所有权,是一种特别权限。

只有root账户可以将文件的所有全转让给其他用户,使其对文件具有所有权,成为所有者。使用chown命令可修改文件所有者

chown命令格式如:

chown [选项] [新所有者] 文件列表
示例:
# 将文件test.txt的所有者改为user1
chown user1 test.txt

# —R参数,递归改变整个test目录及子目录所有文件的所有者为user1
chown -R user1 test/

(2)所属组

这是指文件所有者所属的组,可为该组指定访问权限。默认情况下,文件创建者的主要组即为该文件的所属组。

root账户同样可以修改文件的所属组。使用chgrp命令修改所属组,文件所有者用户也可以修改文件所属组,但是所有者用户必须是修改的目标所属组的组员,否则无法修改。

chgrp命令格式如下:

chgrp [选项] [新的所属组] 文件列表
示例:
# 修改test.txt文件的所属组为group1
chgrp group1 test.txt

# -R参数,通chwon,递归修改整个test目录及子目录所有文件的所属组为group1
chgrp -R group1 test/

(3)其他用户

其他用户就是指文件所有者和所属组之外的所有用户,可以授予最低级别的权限。

2. 访问权限

上面说了,访问权限有3种,读,写,执行,然后对于每一个访问者身份都有这3种权限。

文件的访问权限在文件属性中,通过ls -l就可以查看到文件权限和属性。如下:

$ ls -l
-rw-r--r--  1 root root      358 May 14 15:23 test.txt

如上,第一个root为文件的所有者,第二个root为文件的所属组。文件属性的第一个参数就是文件的权限:-rw-r--r--这个就是文件权限,一共为10个字符,代表的意思如下:

  • 第一个字符:文件类型
  • 字符2-4:所有者权限
  • 字符5-7:所属组权限
  • 字符8-10:其他用户权限

第一个字符表示文件类型,常见的文件类型有:

  • -:表示文件
  • d:表示目录
  • l:表示链接文件
  • b:表示块设置文件
  • c:表示字符设备文件

接下来的字符,以3个为一组,分别表示所有者,所属组,其他用户的权限,每一种访问者身份的3种访问权限依次用r,w,x分别表示读,写,执行。这3种访问权限的位置不会变,如果没有此权限,则使用-表示。

所以上面的文件权限:

-rw-r--r--  1 root root      358 May 14 15:23 test.txt

理解为,这是一个文件,所有者的权限为rw,可读写。 所属组的权限为r,只读。其他用户的权限为r,只读。

此文件的所有者为root,所属组也为root。

3. 修改访问权限

root用户和文件所有者可以修改文件访问权限,使用命令chmod来修改文件权限,格式为:

chmod [选项] [模式] 文件

同样,使用-R参数,可以递归修改整个目录及子目录的所有文件的访问权限。

文件权限可以用字符或者数字来表示。所以相对的,修改文件访问权限,也可以通过字符或者数字:

(1)通过字符修改权限

这时需要具体操作符号来修改权限,

  • +:表示增加某种权限
  • -:表示取消某种权限
  • =:表示指定某种权限
  • u:表示所有者
  • g:表示所属组
  • o:表示其他用户
  • a:表示所有用户(即上面3种用户)
  • r,w,x:表示3种权限,读,写,执行

下面列举几个例子:

# 所属组增加写权限,其他用户增加读权限
chmod g+w,o+r test.txt

# 同时取消所属组和其他用户的读权限
chmod go-r test.txt

# 对所有用户的权限都设置为读和执行
chmod a=rx test.txt

# 对所有用户都增加执行权限
chmod +x test.txt

(2)通过数字修改权限

将3种权限,分别用数字进行表示:

  • 4:表示读权限r
  • 2:表示写权限w
  • 1:表示执行权限x

每一类访问身份的权限用各项访问权限所对应的数字的和表示,依次为所有者,所属组,其他用户设置权限,使用3个数字表示这3个身份的权限。

比如:

644 :表示所有者为读写权限,所属组和其他用户为只读权限
754 : 表示所有者的权限为rwx,所属组的权限为rx,其他用户的权限为r

同样使用命令chmod修改文件权限,示例如下:

# 修改文件的权限为,所有者为rwx,所属组为rw,其他用户为r。
chmod 764 test.txt
等同于
chmod u=rwx,g=rw,o=r test.txt

修改默认的访问权限

你会发现,我们创建文件时,并没有指定文件的权限,就会有一个默认的文件权限:

  • 文件的默认权限为644
  • 目录的默认权限为755

默认权限实际上是通过umask(掩码)来实现的,该掩码用数字表示,实际上是文件权限码的“补码”,默认为022。

创建目录的最大权限为777,减去umask的值022,就等于755,也就是创建文件时的默认权限。

由于文件创建时不能有执行权限,所有创建文件的最大权限为666,减去umask的值022,就等于644,也就是创建文件的默认权限。

可使用umask命令来查看和修改umask的值:

# 查看当前的umask
$ umask
0022    # 最前面的0表示特殊权限,可忽略不看

# 临时修改umask为022,重新登录或者打开新的shell则失效。
$ umask 002

如果想永久修改umask的值,可以修改/etc/profile文件中关于umask值的设置:

总结

Linux的文件权限管理就说到这里,这是Linux系统中的基础知识,作为运维人员是必须了解的。

除了这个基础的文件权限,还存在特殊权限(也叫隐藏权限),是比基础的文件权限更高一层的存在,很多病毒木马黑客等,入侵你服务器后,基本都会用到,详细请看《Linux 文件特殊权限

有任何问题,欢迎留言