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):文件的拥有者,这里是
alice和bob。 - 属组(group):文件所属的用户组,这里是
developers和users。 - 大小、修改时间、文件名。
文件类型与权限共 10 个字符,第一位为类型(- 普通文件,d 目录,l 符号链接等),后 9 位每三位一组,分别代表属主(u)、属组(g)、其他人(o) 的权限:
r(read):读取内容、列出目录文件。w(write):修改文件内容、在目录中创建/删除文件。x(execute):执行文件(二进制程序或脚本)、进入目录。
例如 -rw-r--r-- 表示:属主可读写,属组和其他人只读。drwxr-xr-x 表示目录:属主可读写进入,属组及其他人可读进入。
8.2.2 权限的含义与数字表示
权限常以八进制数字表示,方便记忆与修改:r=4,w=2,x=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),权限尾部分显示为t(drwxrwxrwt)。设置后,即使用户对目录有写权限,也只能删除自己拥有的文件,而不能删除他人的文件。
设置示例:
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)可能损坏系统,务必在执行前确认目标路径。
掌握这些权限工具,你就可以在多用户环境中既保证访问控制,又轻松实现资源共享,并快速定位因权限导致的各种故障。