关于 Linux 文件权限管理

本文档介绍 Linux 系统中文件权限管理的基本内容。

文件权限是系统最底层安全设定方法之一,它保证文件可以被可用的用户做相应操作。通过对文件设定权限可以达到以下三种访问限制权限:

  • 只允许用户自己访问;

  • 允许一个预先指定的用户组中的用户访问;

  • 允许系统中的任何用户访问。

Important

设置文件权限管理是出于系统安全考虑,在所有操作系统中都有类似策略的不同实现。Ubuntu 是 Linux 的一个分支系统,同属 Linux 体系。

文件,权限,拥有者

我们先展开介绍一下一些关键的概念,进一步了解文件权限管理的意义。

对于任意的文件或文件夹,可以使用 ls -l [filename]|[dirname] 查看其具体信息。ls -l 表示展开为表格形式(list)。

这将会得到类似如下的输出:

~ > ls -l
drwx------@ - tommy 28 Oct 12:21 Applications
drwx------@ - tommy 10 Dec 17:18 Desktop
drwx------@ - tommy 11 Dec  9:49 Documents
drwx------  - tommy 11 Dec 14:07 Downloads

文件类型

Linux 系统中包括 2 种基本的文件类型,5 种特殊的文件类型。

文件属性 文件类型
- 常规文件,如包纯文本文件,二进制文件;数据格式的文件,各种压缩文件等
d 目录文件,可以通过 cd 指令进入
b 块设备文件,来自存储数据以供系统存取的接口设备,简单说就是硬盘
c 字符设备文件,来自串行端口的接口设备,例如键盘、鼠标、虚拟终端等
l 符号链接文件,简单说就是替身,软链接,快捷方式
p 通过 FIFO 解决多个程序同时存取一个文件所造成的错误的缓存文件
s 套接字文件,用于实现两个进程进行通信

Note

一般来说,我们只会接触到常规文件和目录文件。

文件所有者与所有组

对于每一个文件,可以按照文件所有者、文件所有组或其他用户组来分别配置文件权限。

  • 所有者(owner):文件的建立者。用户拥有对它所创建的文件的一切权限,所有者可以允许其所在的用户组可以访问所有者的文件。

  • 所有组(group):用户组是具有相同特征用户的逻辑集合。组内所有用户共享改组对文件的权限。

  • 其他用户组(others):除开所有者和所有组内所有用户的所有剩余用户的逻辑合集。

Note

系统中绝大多数系统文件都是由 root 建立的,所以大多数系统文件的所有者都是 root。

文件权限

对于每一个文件,有三种权限可以应用,分别是读取,写入与执行。

权限 含义 对常规文件(-) 对目录文件(d)
r read 读取文件内容 读取目录中文件列表
w write 写入文件内容 创建、删除目录中文件,改变目录名称
x execute 执行该指令文件 进入该目录

对于每一类用户,系统使用 3 位字符来表示权限设置。3 位字符可以按照二进制规则,从 3 位二进制数字表示转化为八进制 1 位数字表示。

权限 二进制 八进制 权限含义
--- 000 0 无权限
r-- 100 4 只读
-w- 010 2 只写
--x 001 1 仅执行
rw- 110 6 读写
r-x 101 5 读取或执行
-wx 011 3 写入或执行
rwx 111 7 所有权限

Note

一般使用八进制 1 位数来表示权限。

权限相关指令

查看权限

使用 ls -l 可以查看单一文件的权限,也可以查看目录下所有文件的权限。添加不同的参数即可。

  • 查看单一文件权限:

    ls -l [filename]
    ls -ld # -d for list dir itself, current dir by default
    ls -ld [dirname] # set dir to [dirname]
    
  • 查看目录下所有文件权限:

    ls -l # current dir by default
    ls -la # -a for hidden files
    ls -lD # -D for only dirs
    ls -l [dirname] # set dir to [dirname]
    
  • 权限内容将以下述格式展开:

    drwxr-x---  2 root root       37 Apr 18 10:50 data
    -rw-r--r--  1 root root    68549 Sep 26  2018 fields.yml
    -rwxr-xr-x  1 root root 33903123 Sep 26  2018 filebeat
    -rwxr-xr-x  1 root root     1011 Mar 27 10:13 filebeat-docker.yml
    

这是一个文件信息的实例:

实例 片段 描述
d 文件类型 1 位字符表示文件类型,常见 -d
rwxr-x--- 文件权限 9 位字符表示文件权限,按所有者、所有组、其他用户组各 3 位展开
2 链接数量 对于文件,表示其软链接数量;对于目录,表示其子目录文件数量
root 所有者 文件的所有者
root 所有组 文件的所有组
37 文件大小 文件大小,单位为字节(byte)
Apr 18 10:50 修改时间 最近一次的修改时间,以当前系统时间为标准
data 文件名 常规文件名含后缀,目录文件不含后缀

Note

文件信息总是按照上述格式展开。

更改文件所有者和所有组

使用 chownchgrp 改变文件的所有者和所有组。使用 R 选项进行递归更改,即改变将适用与目录下所有子文件。

  • 修改文件所有者:

    chown [username] [filename]
    chown -R [username] [filename]
    
  • 修改文件所有组:

    chgrp [groupname] [filename]
    chgrp -R [groupname] [filename]
    
  • 同时修改所有者和所有组:

    chown [username]:[groupname] [filename]
    chown -R [username]:[groupname] [filename]
    

注意,必须是文件所有者才可以更改文件所有者或所有组。这些指令不会有明显的输出,除非触发了权限错误(permission denied)。再次使用 ls -l 查看文件更新后的权限。

修改文件的权限

使用 chmod 进行文件权限的修改。使用 R 选项进行递归更改,即改变将适用与目录下所有子文件。

  • 使用权限的字符表示进行设定:

    chmod [object_group][operator][permisson_combination] [filename]
    chmod -R [object_group][operator][permisson_combination] [filename]
    

    这里的对象组合是指 ugoa,分别表示所有者即用户(user)、所有组(group)、其他用户组(others)、所有用户(all)至少一位的组合;权限操作符包括 +-=,分别表示添加、去除和指定后面的权限组合;权限组合则是 rwx 至少一位的任意组合。

  • 使用权限的数字表示进行设定:

    chmod [permisson_combination] [filename]
    

    这里权限组合是固定三位、八进制权限表示的组合。每一位按序依次表示所有者、所有组、其他用户组的权限。

  • 这里有一些修改文件权限的示例:

    chmod g+w demo.txt
    chmod a+w demo.txt
    chmod o-w demo.txt
    
    chmod go+r demo.txt
    chmod ug=rwx script.py
    chmod a=rw demo.text
    
    chmod 764 scirpt.py
    chmod 700 demo.txt
    chmod 766 demo.txt
    

Warning

文件所有者总是对文件保持所有权限,无论如何进行设置。注意,是当前文件的所有者,而非文件初始的创建者。