人人都会AI编程

8.2 文件权限与归属

更新时间:2026-07-12

Linux 将文件访问控制建立在“谁对这个文件能做什么”这一简洁模型上。每个文件和目录都有一个所有者(属主)和一个所属组(属组),并针对三类用户分别定义读、写、执行三种权限。掌握权限与归属,是安全使用系统、与他人协作以及排查“Permission denied”错误的基础。

8.2.1 查看权限与归属

使用 ls -l 即可看到文件(目录)的详细信息:

$ ls -l
drwxr-xr-x 2 alice developers 4096 May 12 10:30 project/
-rw-r--r-- 1 bob   users       185 Jun 21 14:15 notes.txt

每一行输出从左到右依次包含:

  • 文件类型与权限:如 drwxr-xr-x-rw-r--r--
  • 硬链接数:对文件通常是 1,对目录表示其包含的子目录数。
  • 属主(user):文件的拥有者,这里是 alicebob
  • 属组(group):文件所属的用户组,这里是 developersusers
  • 大小修改时间文件名

文件类型与权限共 10 个字符,第一位为类型(- 普通文件,d 目录,l 符号链接等),后 9 位每三位一组,分别代表属主(u)属组(g)其他人(o) 的权限:

  • r(read):读取内容、列出目录文件。
  • w(write):修改文件内容、在目录中创建/删除文件。
  • x(execute):执行文件(二进制程序或脚本)、进入目录。

例如 -rw-r--r-- 表示:属主可读写,属组和其他人只读。drwxr-xr-x 表示目录:属主可读写进入,属组及其他人可读进入。

8.2.2 权限的含义与数字表示

权限常以八进制数字表示,方便记忆与修改:r=4w=2x=1,三种权限相加即得组合值。例如 rwx = 4+2+1=7;r-x = 4+1=5;rw- = 4+2=6。
常见的权限模式:

  • 755(rwxr-xr-x):属主全权,其他人读执行,常用于可执行文件和目录。
  • 644(rw-r--r--):属主可读写,其他人只读,常用于普通文件。
  • 600(rw-------):仅属主可读写,常用于私密配置(如私钥文件)。

8.2.3 修改权限:chmod

chmod 命令支持符号模式或数字模式:

  • 符号模式chmod u+x script.sh(属主增加执行权),chmod go-w file(属组和其他人移除写权限)。
  • 数字模式chmod 755 program 直接设置权限为 rwxr-xr-x。

递归修改目录及内部所有文件(谨慎使用):

chmod -R 755 mydir

8.2.4 修改归属:chown 与 chgrp

修改属主和属组需要 root 权限:

chown bob report.txt          # 将 report.txt 的属主改为 bob
chown bob:users report.txt    # 同时修改属主和属组
chgrp developers project/     # 仅修改属组

递归修改:

chown -R alice:staff shared/

8.2.5 目录权限的特殊性

目录的读、写、执行权限与常规理解略有差异:

  • r(读):允许列出目录中的文件名(如 ls)。仅有 r 权限而没有 x 权限,只能看到文件名,无法查看详细信息或进入目录。
  • w(写):允许在目录内创建、删除、重命名文件(即使文件本身不归你所有)。因此对共享目录要谨慎赋予写权限,通常结合粘滞位(见下文)来防止误删。
  • x(执行):允许“进入”目录,即可以 cd 进去,或作为路径的一部分访问内部文件。如果要访问 /home/user/docs/file,必须对路径中所有目录拥有执行权限。

8.2.6 特殊权限:SUID、SGID 和粘滞位

常用的特殊权限三位也有对应的位:

  • SUID(4xxx):当文件设置了 SUID 且可执行时,执行该程序的用户会临时获得文件属主的权限。例如 passwd 命令允许普通用户修改自己的密码(需写入 /etc/shadow),其权限为 -rwsr-xr-x(属主的执行位显示为 s)。
  • SGID(2xxx):作用于文件时,类似 SUID 但以文件属组身份运行。作用于目录时,在该目录下创建的新文件会自动继承目录的属组,适用于团队共享目录。
  • 粘滞位(1xxx):通常用于共享目录(如 /tmp),权限尾部分显示为 tdrwxrwxrwt)。设置后,即使用户对目录有写权限,也只能删除自己拥有的文件,而不能删除他人的文件。

设置示例:

chmod u+s /usr/bin/myapp      # 设置 SUID
chmod g+s shared_dir/         # 设置 SGID
chmod +t /tmp                 # 设置粘滞位

数字模式下,将特殊位数值放在普通权限前,如 chmod 4755 表示 SUID + rwxr-xr-x;chmod 1777 表示粘滞位 + rwxrwxrwx。

8.2.7 默认权限:umask

新创建文件和目录的默认权限由 umask 决定。umask 是一个掩码值,用于从系统默认最大权限中“屏蔽”掉不想授予的权限。常见默认最大权限:文件为 666(rw-rw-rw-),目录为 777(rwxrwxrwx)。实际创建时的权限 = 最大权限 - umask。

  • 通常系统 umask 为 022,则新建文件权限为 644(666-022),目录为 755(777-022)。
  • 更严格的 umask 例如 077,则新建文件为 600,目录为 700,仅属主可访问。

查看当前 umask:

umask        # 输出如 0022

临时修改:

umask 077

永久修改可在 ~/.bashrc/etc/profile 中设置。

8.2.8 实用注意事项

  • 对私密文件(如 SSH 私钥)通常设置为 600,属主为自己。
  • 脚本文件若需直接执行,必须同时具备可读和可执行权限(chmod +x)。
  • 很多“Permission denied”错误并非文件本身权限问题,而是路径中某个父目录缺少执行权限。
  • 在共享服务器上,建议利用 SGID 和粘滞位精细控制团队目录的权限行为。
  • 修改系统文件权限或随意使用递归参数(-R)可能损坏系统,务必在执行前确认目标路径。

掌握这些权限工具,你就可以在多用户环境中既保证访问控制,又轻松实现资源共享,并快速定位因权限导致的各种故障。