Skip to content

文件权限

2级访问控制

Linux使用2级权限方式控制文件的访问:

  • 第一级是针对读/写/执行的权限设置;
  • 第二级是针对用户/组/其他的权限设置

读/写/执行

  • 读权限控制文件内容是否可以被读取,以r表示
  • 写权限控制文件内容是否可以被修改,以w表示
  • 执行权限控制文件是否可以被执行,以x表示

用户/组/其他

Linux针对当前文件将用户划分为3个范围:

  • 拥有该文件的用户
  • 和当前用户属于同一组的其他用户
  • 不和当前用户属于同一组的其他用户

查询工具

通常使用以下几种工具查询文件权限

  • ls
  • stat

ls

ls是最常用的文件信息查询工具

List information about the FILEs (the current directory by default).

单个文件

$ ls -al Dockerfile 
-rw-rw-r-- 1 zj zj 119 9月  24 16:03 Dockerfile

多个文件

搜索当前目录的所有文件权限

$ ls -al
total 68
drwxrwxr-x  10 zj zj  4096 9月  28 09:53 .
drwxr-xr-x  74 zj zj  4096 9月  29 09:25 ..
drwxrwxr-x  17 zj zj  4096 9月  25 16:20 deepin-wine-ubuntu
-rw-rw-r--   1 zj zj   119 9月  24 16:03 Dockerfile
drwxrwxr-x 201 zj zj  4096 9月  24 11:22 dockerfiles
...
...

说明

以单个文件搜索结果为例,文件权限部分在第一列

-rw-rw-r--

第一字节表示节点类型(node type):-表示文件;d表示目录;l表示符号链接;c表示字符设备;p表示伪终端;b表示块设备

接下来9个字符分为3块,分别代表用户、组和其他的权限;每块3个字符,分别代表读、写和执行权限

r表示读;w表示写;x表示执行;-表示没有权限

所以文件Dockerfile可以被当前用户读/写,被同组用户读/写,被其他用户读

stat

stat是一个更详细的文件权限查询工具

$ stat Dockerfile 
  File: 'Dockerfile'
  Size: 119         Blocks: 8          IO Block: 4096   regular file
Device: 10304h/66308d   Inode: 17118015    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/      zj)   Gid: ( 1000/      zj)
Access: 2019-09-26 15:38:17.136309351 +0800
Modify: 2019-09-24 16:03:31.089612824 +0800
Change: 2019-09-24 16:03:31.121613208 +0800
 Birth: -

打印访问权限

$ stat -c %A Dockerfile 
-rw-r--r--
$ stat -c %a Dockerfile 
644

打印所属用户/组

# 组合打印文件所属用户/组
$ stat -c %U:%G dockerfiles/ 
zj:zj

打印文件类型

# 文件
$ stat -c %F Dockerfile 
regular file
# 目录
$ stat -c %F dockerfiles/ 
directory

设置工具

针对Linux2级访问控制,使用chmod修改文件的读/写/执行权限,使用chown/chgrp修改文件的用户/组/其他权限

chmod

使用chmod进行设置,有两种方式设置文件权限

  1. 数值设置
  2. 符号设置

参数-v表示显示文件权限的改变信息

参数-R, --recursive表示递归设置文件权限

数值设置

语法如下:

chmod [OPTION]... OCTAL-MODE FILE...

chmod8进制数值表示文件的权限,通过数值设置可以准确修改用户/组/其他的文件权限

754为例,其表示如下

  • 对于当前用户而言,其对文件能够读/写/执行
  • 对于同组用户而言,其对文件能够读/执行
  • 对于其他用户而言,其对文件能够

执行如下:

$ chmod -v 754 Dockerfile 
mode of 'Dockerfile' changed from 0775 (rwxrwxr-x) to 0754 (rwxr-xr--)

符号设置

语法如下:

$ chmod [references][operator][modes] file ...

符号设置由3部分组成,第一个部分指定对象,第二个部分指定如何操作,第三个部分指定操作的内容

指定对象

  • 符号u表示当前用户
  • 符号g表示同组用户
  • 符号o表示其他用户
  • 符号a表示所有用户
如何操作

  • 符号+表示增加指定权限(如果没有的话)
  • 符号-表示移除指定权限(如果有的话)
  • 符号=表示设置指定对象的文件权限
操作内容

  • 符号r表示读权限
  • 符号w表示写权限
  • 符号x表示执行权限
示例

对所有用户添加写入权限

$ chmod -v a+w Dockerfile 
mode of 'Dockerfile' changed from 0754 (rwxr-xr--) to 0776 (rwxrwxrw-)

设置当前用户为读/写权限

$ chmod -v u=rw Dockerfile 
mode of 'Dockerfile' changed from 0776 (rwxrwxrw-) to 0676 (rw-rwxrw-)

取消同组用户/其他用户的写和执行操作

$ chmod -v go-wx Dockerfile 
mode of 'Dockerfile' changed from 0676 (rw-rwxrw-) to 0644 (rw-r--r--)

chown/chgrp

  • chown修改当前文件所属的用户
  • chgrp修改当前文件所属的组

chown

系统中任何文件的所有权只能由超级用户更改。用户不能放弃文件的所有权,即使用户拥有它。类似地,只有组成员才能将文件的组ID更改为该组

chown [OPTION]... [OWNER][:[GROUP]] FILE...

参数-v表示显示文件权限的改变信息

参数-R, --recursive表示递归设置文件权限

修改文件Dockerfile的当前用户为root

# chown -v root Dockerfile
changed ownership of 'Dockerfile' from zj to root

此时文件Dockerfile的当前用户是root,所属组为zj。再次修改文件Dockerfile的当前用户为root,同时其组为root

# chown -v root:root Dockerfile 
changed ownership of 'Dockerfile' from root:zj to root:root

chgrp

chgrp修改文件所属组

chgrp [OPTION]... GROUP FILE...

参数-v表示显示文件权限的改变信息

参数-R, --recursive表示递归设置文件权限

修改文件Dockerfile所属组为root

# chgrp -v root Dockerfile 
changed group of 'Dockerfile' from zj to root

此时其用户为zj,所属组为root