Linux 的文件权限和 chmod 命令详解

一   文件权限

1.1 三种文件权限(Read、Write、Execute)

在 Linux 系统中,用户对文件有三种权限,分别是:

  • 读权限(Read):读取文件内容的权限。对于文件夹,读权限指列出文件夹下的文件,ls 命令需要读权限;
  • 写权限(Write):修改文件的权限。对于文件夹,写权限指新建和删除文件夹下的文件;
  • 执行权限(Execute):执行文件的权限。对于文件夹,执行权限指进入文件夹,cd 命令需要执行权限。

对于文件权限,特别说明如下:

  • 若一个文件没有读权限,则可以使用 mv 命令移动该文件,但不能使用 cp 命令复制该文件,因为移动不需要读文件内容,只要修改 inode 节点信息,但复制需要读文件内容;
  • Linux 系统中,一切皆文件,因此文件夹是一种特殊的文件,文件夹的内容就是文件夹下的文件信息;
  • 若一个文件夹只有执行权限,则可以使用 cd 命令进入该文件夹,但不能使用 ls 命令列出该文件夹下的文件,因为 ls 命令需要该文件夹的读权限;
  • 若一个文件夹只有读权限,则不能使用 cd 命令进入该文件夹,因为 cd 命令需要该文件夹的执行权限,但可以使用 ls 命令列出该文件夹下的文件;
  • 若一个文件夹同时拥有读权限执行权限,则可以使用 cd 命令进入该文件夹,并使用 ls 命令列出该文件夹下的文件,但是不能新建、重命名、删除文件,因为所有的文件操作均需要该文件夹的写权限。

1.2 三种用户身份(User、Group、Other)

首先说一下用户和用户组的概念,我们必须以一个用户的身份登录 Linux 系统,一个用户可以属于多个用户组,但一个用户仅有一个默认的用户组,一个用户组可以包含多个用户。

每个文件都设有三种用户身份,分别是:

  • 文件拥有者(User):通常是创建该文件的用户;
  • 文件拥有组(Group):通常是创建该文件用户的默认用户组,但在不同的操作系统中可能有所差异,也有可能是该文件所在目录的用户组,即继承目录文件的组权限;
  • 其他用户(Other):除了文件拥有者和文件拥有组之外的其他用户。

对于每个文件,我们可以针对三种用户身份制定不同的权限策略,所以每个文件需要存储 9 个权限位(mode bit)。每个权限位一般只有两种状态,但 3 个执行权限位可能会有两种以上的状态。

1.3 三种特殊权限(Setuid、Setgid、Sticky)

除了常规的读、写、执行这三种权限,我们还有三种特殊权限。这三种特殊权限只对可执行文件(程序)和目录文件(文件夹)起作用,分别是:

  • 设置用户 ID 位(Setuid,the set-user-ID bit):对于可执行文件,将进程的用户 ID 设置为该文件的用户 ID,这句话比较难理解,举个例子,当某个进程访问一个属于 root 用户的文件时,该进程会以 root 权限访问该文件。对于某些操作系统中的目录文件,在该目录下创建文件时,新创建文件的拥有者将和该目录的拥有者一致,而不管是哪个用户创建的,同时新创建的子目录的 setuid 位会继承该目录的 setuid 位。但我在 Ubuntu 20.04 中测试无效,具体实现因操作系统而异;
  • 设置用户组 ID 位(Setgid,the set-group-ID bit):和 setuid 类似,对于可执行文件,将进程的用户组 ID 设置为该文件的用户组 ID。对于某些操作系统中的目录文件,在该目录下创建文件时,新创建文件的拥有组将和该目录的拥有组一致,而不管是哪个用户创建的,同时新创建的子目录的 setgid 位会继承该目录的 setgid 位;
  • 禁止删除标记或粘性位(Sticky,the restricted deletion flag or sticky bit):当一个目录启用该权限位时,无特权的用户将不能删除或重命名该目录下的文件,除非该用户拥有该目录或某个文件。如图 3 中的 “/tmp” 目录,这类全局可写的目录会启用该权限位,这样,一个用户只能删除和重命名属于自己的文件,而不能改动属于其他用户的文件。同时,对于一些旧系统,当一个文件启用该权限位时,系统会将该文件缓存在交换空间(swap)中以更快地加载,此时我们称该文件是具有“粘性”的。

1.4 文件类型(File Type)

严格来说,文件类型(file type)不属于文件权限体系的一部分,但 Linux 系统在显示文件权限时,往往也会显示文件类型,所以我们在这里简单地提一下。

文件类型通常使用 1 位字符来标识,常见的有 “-”、“d”、“l” 等,其中 “-” 表示一个普通文件,“d” 表示一个文件夹, “l” 表示一个符号链接。表 1 详细列举了所有的文件类型 1

表1   文件类型
标识字符英文描述备注
-regular file普通文件(常见)
bblock special file
ccharacter special file
Chigh performance (“contiguous data”) file
ddirectory文件夹(常见)
Ddoor (Solaris 2.5 and up)
lsymbolic link符号链接(常见)
Moff-line (“migrated”) file (Cray DMF)
nnetwork special file (HP-UX)
pFIFO (named pipe)
Pport (Solaris 10 and up)
ssocket
?some other file type

1.5 Linux 系统的文件权限位(File Mode Bits)

前面我们介绍了权限位的概念,每个文件都有 9 个权限位,这 9 个权限位共同构成了一个文件的文件权限位 2(file mode bits)。在 Linux 系统中,每个文件的权限均使用文件权限位来表示,其结构如图 1 所示。

图 1 展示了文件权限位的所有状态,文件权限位一共有 10 个位。其中,第 1 位(蓝色)表示文件类型,标识该文件是普通文件、文件夹、符号链接,还是其它类型的文件。在接下来的第 2 ~ 10 位中,r、w、x 分别表示写权限、读权限、执行权限。第 2 ~ 4 位(红色)表示 user 的 rwx 权限,第 5 ~ 7 位(黄色)表示 group 的 rwx 权限,第 2 ~ 4 位(绿色)表示 other 的 rwx 权限。若某位具有相应的权限,则显示相应的字母,否则显示 “-” 。

三种特殊权限分别与三个 x 位共享显示。以 setuid 为例,setuid 与 user 的 x 位共享一位。若 user 有执行权限,即其 x 位为 “x” ,则设置 setuid 后,“x” 变成 “s” ,取消 setuid 后,“s” 变回 “x” ;若 user 没有执行权限,即其 x 位为 “-” ,则设置 setuid 后,“-” 变成 “S” ,取消 setuid 后,“S” 变回 “x” 。若 user 的 x 位是 “S” ,给 user 增加执行权限后,“S” 变成 “s” 。总结一下,就是:

  • 若 “x” 和 setuid 都未被设置,则显示 “-” ;
  • 若仅 “x” 被设置,则显示 “x” ;
  • 若仅 setuid 被设置,则显示 “S” ;
  • 若 “x” 和 setuid 都被设置,则显示 “s” ;

设置 setuid 后,通过大小写来判断是否用户具有执行权限。同理,setgid 和 sticky 位遵循同样的规则,不过 sticky 位用 “t” 和 “T” 表示。

file-mode-bits

图1   文件权限位的结构

我们以图 2 为例,说明一下文件权限位的作用。我们有 3 个用户组 A、B、C 和 5 个用户 a、b、ab、c、cc,其中,用户 ab 同时属于用户组 A 和 B ,用户 a 属于用户组 A ,用户 b 属于用户组 B ,用户 c 和 cc 属于用户组 C ,其中用户 ab 默认的用户组是 B 。

对于文件 1.txt ,文件拥有者是用户 ab ,因此用户 ab 获取该文件的 user 权限 rwx ;文件拥有组是用户组 A ,用户组 A 中除了用户 ab 之外还有一个用户 a ,因此用户 a 获取该文件的 group 权限 r-x ;除此之外的所有其他用户,用户 b、c、cc 获取该文件的 other 权限 r- - 。注意,虽然用户 ab 也属于用户组 B ,但用户组 B 中的用户 b 并不获取该文件的 group 权限,因为这个组是由文件拥有组指定的,该文件指定的是用户组 A 。

对于文件 log ,“d” 标识这个文件是一个目录文件(Linux 中一切皆文件!包括文件夹!)。文件拥有者是用户 c ,因此用户 c 获取该文件的 user 权限 r-x ;文件拥有组是用户组 B ,用户组 B 中除了用户 c 之外还有两个用户 b 和 ab ,因此用户 a 和 ab 获取该文件的 group 权限 r- - ;除此之外的所有其他用户,用户 a、cc 获取该文件的 other 权限 - - - 。注意,文件拥有者不一定要属于文件拥有组,这里用户 c 就不属于用户组 B 。

example

图2   文件权限位的样例说明

在 Linux 系统的终端中,使用如下的 ls 命令可以查看当前文件夹下所有文件的详细信息,其中就包括了每个文件的文件权限位。

ls -l

在图 3 中,我们使用上述命令查看根目录下所有文件的详细信息。输出信息一共有 9 列,从左到右分别表示:文件权限位、硬链接数、文件拥有者、文件拥有组、文件大小(Byte)、月、日、时刻、文件名。例如,第一个文件是一个符号链接文件,文件拥有者是 root 用户,文件拥有组是 root 组,所有用户都有该文件的读、写、执行权限。

ls

图3   使用 ls 命令查看根目录下的文件

二   chmod 命令

2.1 数值模式

数值模式使用 “四位八进制数” 来表示文件权限,其中第 1 位表示三种特殊权限,第 2 位表示 user 的权限,第 3 位表示 group 的权限,第 4 位表示 other 的权限,每个位的取值范围都从 0 ~ 7 ,共 8 个取值。也就是说,每个位都表示了三种权限,三种权限共享一位,表 2 列举了所有的 9 种权限,“4000” 表示第 1 位值为 4 ,“10” 表示第 3 位值为 1 ,以此类推。

注意到,每个权限都是 2 的幂次,即每个权限的值都是 1、2、4 这样的数值,写成八进制表示分别是 01、010、0100 ,这里约定以 0 开头的数都是八进制数。这样,每个位上的三个权限互不干扰,例如 7 写成八进制是 0111 ,有唯一分解 0111 = 0100 + 010 + 01 ,即 7 = 4 + 2 + 1 ,也就是说该位同时表示了三种权限,其它情况以此类推。

表2   数值与权限对照表
数值说明
4000setuid 特殊权限
2000setgid 特殊权限
1000sticky 特殊权限
400user 的 read 权限
200user 的 write 权限
100user 的 execute 权限
40group 的 read 权限
20group 的 write 权限
10group 的 execute 权限
4other 的 read 权限
2other 的 write 权限
1other 的 execute 权限

如图 4 所示,一个文件的权限位为 “3754” 。第 1 位的值为 “3” ,表示有 setgid 和 sticky 特殊权限;第 2 位的值为 “7” ,表示 user 有 rwx 权限,第 3 位的值为 “5” ,表示 group 有 rx 权限,第 4 位的值为 “4” ,表示 other 有 r 权限。在文件权限位表示中,group 有 x 和 setgid 权限,因此用 “s” 表示,而 other 只有 sticky 权限,因此用 “T” 表示。

numeric-mode

图4   数值模式的样例说明

在数值模式中,前导 0 可加可不加,例如 “0055”、“055”、“55” 表示同一个意思。但是,由 5 个数字构成的数值往往具有特殊含义,例如 “00055” 会清除特殊权限,我们将在 2.3 节中详细说明。

我们经常使用 “chmod 777 file” 这样的命令,表示三种身份的用户都拥有 rwx 权限。命令 “chmod 777 dir” 与 “chmod =777 dir” 的区别是,前者会保留目录文件的 setuid 和 setgid 权限,后者会删除目录文件的 setuid 和 setgid 权限,但是两个命令都会删除 sticky 权限,例如 “d rws r-s r-T” 执行 “chmod 777 dir” 命令后变成 “d rws rws rwx” ,执行 “chmod =777 dir” 命令后变成 “d rwx rwx rwx” 。特别注意,该规则仅对目录文件有效,若不是目录文件,则两个命令均会删除该文件的三个特殊权限,例如 “- rwx r-s r-T” ,在执行 “chmod 777 file” 和 “chmod =777 file” 命令之后,均会变成 “- rwx rwx rwx” 。

2.2 符号模式

在符号模式中,三种身份的用户分别用其单词的开头小写字母表示,此外,“a” 可以表示所有三种身份的用户,分别是:

  • u:User ,文件拥有者;
  • g:Group ,文件拥有组;
  • o:Other ,除了文件拥有者和文件拥有组之外的其他用户;
  • a:All ,所有的三种身份的用户,等效于 “ugo” ;

符号模式提供了三种对权限的修改操作符,分别是:

  • +:增加某身份用户的权限;
  • -:删除某身份用户的权限;
  • =:明确设定某身份用户的权限;

三种普通权限和三种特殊权限均用一个小写字母表示,分别是:

  • r:Read ,读权限;
  • w:Write ,写权限;
  • x:Execute ,执行权限;
  • s:Setuid 或 Setgid 特殊权限,当和 “u” 组合使用时表示 setuid 位,当和 “g” 组合使用时表示 setgid 位,当和 “o” 组合使用时无效果,当和 “a” 组合使用时表示同时设置 setuid 和 setgid 位;
  • t:Sticky 特殊权限,当和 “u” 及 “g” 组合时无效果,当单独使用时,或和 “o” 及 “a” 组合使用时,表示 sticky 位;

表 3 中,第 1 ~ 3 个样例(u-wx / g=wx / o+wx),分别使用了 “-”、“=”、“+” 运算符,而第 4 个样例(u-x,g-x+w,o=rw)混合使用了三个运算符,用逗号隔开每个操作。

第 2 和 5 ~ 7 个样例,展示了 “=” 的几种用法。普通用法就像第 2 个样例(g=wx)一样,显式地指定用户和权限;第 5 个样例(go=),“=” 后面不指定任何权限,则表示清除该用户的所有权限;第 6 个样例(=rw),“=” 前面不指定任何用户,则表示选择所有用户 “a”,此时系统还要减去 umask 值,才能得到最终的文件权限,在此样例中,执行 “=rw” 命令后的文件权限是 0666 ,系统的 umask = 0002 ,则最终的文件权限为 0666 - 0002 = 0664 ;第 7 个样例(=),既不指定用户也不指定权限,表示清除所有用户的所有权限,最终的文件权限为 0000 。

第 8 个样例(gu+ / a-),“-” 和 “+” 运算符后面不指定权限的话,命令无任何效果。

第 9 个样例(g+u),表示 group 的权限加上 user 的权限,同理,“-” 和 “=” 也可以这样操作。

表3   chmod 命令语法汇总表
编号初始的文件权限位数值模式命令等效的符号模式命令修改后的文件权限位备注
1- rwx r-x r- -chmod -300 1.txtchmod u-wx 1.txt- r- - r-x r- -删除权限
2- rwx r-x r- -chmod 734 1.txtchmod g=wx 1.txt- rwx -wx r- -设定权限
3- rwx r-x r- -chmod +3 1.txtchmod o+wx 1.txt- rwx r-x rwx增加权限
4- rwx r-x r- -chmod -111,+222 1.txtchmod a-x+w 1.txt- rw- rw- rw-混合模式
5- rwx r-x r- -chmod u-x,-10,+20,o=rw 1.txtchmod -100,g-x+w,o=rw 1.txt- rw- rw- rw-混合模式
6- rwx r-x r- -chmod -77 1.txt
chmod 700 1.txt
chmod go= 1.txt
chmod go-rwx 1.txt
- rwx - - - - - -“=” 操作
7- rwx r-x r- -chmod 0 1.txtchmod = 1.txt- - - - - - - - - -“=” 操作
8- rwx r-x r- -chmod 664 1.txtchmod =rw 1.txt- rw- rw- r- -“=” 操作,umask = 0002
9- rwx r-x r- -chmod +0 1.txtchmod ug+ 1.txt
chmod a- 1.txt
- rwx r-x r- -无效命令
10- rwx r-x r- -chmod 774 1.txtchmod g+u 1.txt- rwx rwx r- -复制权限
S1- rwx r-x r- -chmod +4000 1.txtchmod u+s 1.txt- rws r-x r- -设定 setuid 位
S2- rwx r-x r- -chmod +6000 1.txtchmod +s 1.txt
chmod a+s 1.txt
chmod u+s,g+s 1.txt
- rws r-s r- -设定 setuid 和 setgid 位
S3- rwx r-x r- -chmod 2704 1.txtchmod g=s 1.txt- rwx - -S r- -只保留 setgid 位
S4- rwx r-x r- -chmod 06744 1.txtchmod g-x,a+s 1.txt- rws r-S r- -设定 setuid 和 setgid 位
S5- rwx r-x r- -chmod +0 1.txtchmod o+s 1.txt- rwx r-x r- -无效命令
T1- rwx r-x r- -chmod +1000 1.txtchmod +t 1.txt
chmod o+t 1.txt
chmod a+t 1.txt
- rwx r-x r- T设定 sticky 位
T2- rwx r-x r- -chmod +1001 1.txtchmod +tx 1.txt- rwx r-x r-t设定 sticky 位
T3- rwx r-x r- -chmod +0 1.txtchmod u+t 1.txt
chmod g+t 1.txt
- rwx r-x r- -无效命令

2.3 目录文件 Setuid 和 Setgid 位的特别说明

在大部分操作系统中,如果一个目录文件设定了 setgid 位,在该目录下新建一个文件(包括目录文件),新文件的拥有组继承其父目录的拥有组,此外,新目录文件的 setgid 位还会继承其父目录的 setgid 位。这种机制的好处是让共享文件变得更加方便。此外,在一些操作系统中,setuid 位也遵循该规则,但我的 Ubuntu 20.04 中并没有。

举个例子,在某操作系统中,新建普通文件的默认权限位是 “- rw- rw- r- -” ,新建目录文件的默认权限位是 “d rwx rwx r-x” 。如图 5 所示,一个目录文件 dir1 属于用户 a 和用户组 A ,现在用户 b 在 dir1 下新建了一个目录文件 dir2 和一个普通文件 1.txt ,则两个新文件的拥有者都是 b ,因为是 b 创建的文件。但 dir1 设置了 setgid 位,导致两个新文件的拥有组都是 A 。此外,dir2 的 setgid 位继承了 dir1 的 setgid 位。

特别注意,若一个文件的拥有者 owner 不属于该文件的拥有组 group ,则 owner 可以使用命令 “chmod g-s dir” 清除 setgid 权限,但无法再设定 setgid 权限,即命令 “chmod g+s dir” 无效,但可以提权使用 “sudo chmod g+s dir” 来设定 setgid 权限。例如在图 5 中,如果用户 b 想给 dir2 添加 setgid 权限,必须要 sudo 权限,即命令 “chmod g+s dir2” 无效,必须要 “sudo chmod g+s dir2” 才有效。

setgid

图5   Setgid 位的样例说明

一般的 chmod 和 mkdir 命令并不会影响 setuid 和setgid 位,除非在符号模式中显式指定,或使用形如 “=755” 的数值模式,或使用形如 “00755” 这样五位及以上八进制数的数值模式。

以下这些命令,不会影响目录文件的 setuid 和 setgid 位,即保留当前值:

mkdir A B C
chmod 755 A
chmod 0755 B
chmod u=rwx,go=rx C
mkdir -m 755 D
mkdir -m 0755 E
mkdir -m u=rwx,go=rx F

以下这些命令,会修改目录文件的 setuid 和 setgid 位:

mkdir G
chmod 6755 G
chmod +6000 G
chmod u=rwx,go=rx,a+s G
mkdir -m 6755 H
mkdir -m +6000 I
mkdir -m u=rwx,go=rx,a+s J

以下这些命令,会清除目录文件额 setuid 和 setgid 位:

chmod a-s D
chmod -6000 D
chmod =755 D
chmod 00755 D

参考文献


  1. GNU 文档 10.1.2 What information is listed ↩︎

  2. GNU 文档 27 File Permissions ↩︎

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
chmod命令是Linux系统中用来更改文件或目录的权限的命令。该命令格式为:chmod [选项] 权限 文件名。 权限可以是数字或字母,分别表示文件所有者、用户组和其他用户的读、写和执行权限。 数字表示权限的方法: - 数字0表示无权限; - 数字4表示读权限; - 数字2表示写权限; - 数字1表示执行权限; - 数字7表示读、写、执行权限。 字母表示权限的方法: - u表示文件所有者; - g表示用户组; - o表示其他用户; - a表示所有用户; - +表示增加权限; - -表示减少权限; - =表示设置权限。 如: chmod 755 test.txt 表示文件所有者有rwx权限,用户组和其他用户有rx权限 常用选项: - -R:递归处理,将权限更改应用到目录中的所有文件和子目录。 - -v:显示详细信息。 常用权限设置: - chmod 755 filename 表示文件所有者有rwx权限,用户组和其他用户有rx权限 - chmod 600 filename 表示文件所有者有rw权限,用户组和其他用户无权限 - chmod 777 filename 表示所有用户有rwx权限 - chmod +x filename 表示增加文件的执行权限 - chmod -x filename 表示减少文件的执行权限 总之,chmod命令是用来更改文件或目录的权限的命令,可以使用数字或字母表示权限,并可以指定文件所有者、用户组和其他用户的读、写和执行权限。使用-R选项可以递归地更改目录中的所有文件和子目录的权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值