本文目录导读:

文件权限的分配是 Linux/Unix 系统安全的核心,就是决定谁可以对某个文件或文件夹做什么操作。
下面从基本概念、分配方法和常见实践三个方面来讲解。
核心概念:三组对象 + 三种权限
权限系统围绕 3种对象 和 3种权限 构建。
三种对象 (Who)
- u (user/owner):文件或目录的所有者,通常是创建它的用户。
- g (group):文件或目录所属的用户组,组内所有用户共享此权限。
- o (others):其他用户,既不是所有者,也不属于所属组的用户。
三种权限 (What)
- r (read):
- 文件:可以查看文件内容 (如
cat,less)。 - 目录:可以列出 (如
ls)。
- 文件:可以查看文件内容 (如
- w (write):
- 文件:可以修改、删除文件内容。
- 目录:可以在目录内创建、删除、重命名文件和子目录。
- x (execute):
- 文件:可以执行该文件 (如运行脚本或程序)。
- 目录:可以进入该目录 (如
cd) 并访问其内部的文件(即使不能ls)。
举个例子:
查看一个文件的权限:ls -l filename
-rwxr--r-- 1 user group 1024 Jan 1 00:00 script.sh
- 文件类型 ( 是普通文件,
d是目录) rwx: 所有者权限 (读、写、执行)r--: 组权限 (只读)r--: 其他用户权限 (只读)
分配方法:数字法与符号法
修改权限使用 chmod 命令,有两种主要方式:
数字法 (最快,最常用)
用数字代表权限:
- r = 4
- w = 2
- x = 1
把对象的三个权限数字相加:
rwx= 4+2+1 = 7rw-= 4+2+0 = 6r-x= 4+0+1 = 5r--= 4+0+0 = 4- = 0+0+0 = 0
格式: chmod [三位数字] 文件名
示例:
chmod 755 script.sh- 所有者:7 (rwx) 所有者拥有完全控制权。
- 组:5 (r-x) 组成员可以读取和执行,不能修改。
- 其他:5 (r-x) 其他用户可以读取和执行。
chmod 644 report.txt- 所有者:6 (rw-) 可以读写。
- 组:4 (r--) 只能读。
- 其他:4 (r--) 只能读。
chmod 700 private_key.pem- 所有者:7 (rwx) 完全控制。
- 组/其他:0 (---) 完全拒绝,这个权限非常重要,用于SSH私钥等敏感文件。
符号法 (更直观,适合微调)
用字母 u, g, o, a (all,代表所有人) 和操作符 (增加), (移除), (设置)。
示例:
chmod u+x script.sh给所有者增加执行权限。chmod g-w report.txt移除组用户的写权限。chmod o=r filename将其他用户的权限设置为只读。chmod a+x script.sh给所有用户增加执行权限(谨慎使用,有安全风险)。
实际分配策略与最佳实践
权限分配应该遵循 最小权限原则,即只给予完成任务所需的最少权限。
-
个人文件 (如
~/Documents/):chmod 700 ~/Documents或chmod 600 ~/personal_finance.xlsx- 解释:只有你自己能访问,别人无法看到你的私人目录或文件。
-
网站文件 (如
public_html/):- 目录:
chmod 755 public_html/ - 文件:
chmod 644 index.html - 解释:Web服务器通常以
www-data用户运行,需要读取权限,你需要写权限来上传文件。755和644是绝大多数场景下的标准。
- 目录:
-
SSH 密钥 (如
~/.ssh/id_rsa):chmod 600 ~/.ssh/id_rsa或chmod 400 ~/.ssh/id_rsa- 解释:如果权限过大 (
644或755),SSH 客户端会拒绝使用它,直接报错Permissions 0644 for 'id_rsa' are too open,必须只有所有者可读。
-
脚本或应用程序 (如 shell 脚本):
chmod 755 deploy.sh或chmod 700 deploy.sh- 解释:给自己执行权限,其他人可以读但不能改,如果是内部敏感工具,可以
700。
-
共享项目目录 (多人协作):
- 方法一 (传统组方式):
- 创建组:
sudo groupadd project_team - 将用户加入组:
sudo usermod -aG project_team user1,user2 - 设置项目目录组:
sudo chown -R your_user:project_team /path/to/project - 设置权限(常用):目录
chmod 2775 project/(注意2设置SGID),文件umask 002(使新文件组可写)。
- 创建组:
- 解释:任何在
project_team组里的人都可以读写项目文件,但只有你拥有,SGID位(2)确保新创建的文件继承目录的组。
- 方法一 (传统组方式):
-
全局可执行程序 (系统命令):
- 通常位于
/usr/bin/,/usr/local/bin/。 - 权限:
755(所有人可执行,只有root可改)。 - 注意:普通用户极少需要修改这些文件,需要
sudo。
- 通常位于
特殊场景处理
-
递归修改: 对目录和其内部所有内容应用权限。小心使用,很容易打乱系统权限。
chmod -R 755 /path/to/directory(目录用755)chmod -R 644 /path/to/directory(文件用644)- 更安全的递归方法:
- 仅改目录:
find /path -type d -exec chmod 755 {} \; - 仅改文件:
find /path -type f -exec chmod 644 {} \;
- 仅改目录:
-
ACL (访问控制列表): 当常规的“所有者-组-其他”模型不够用时 (例如需要给特定用户权限而无需创建新组),使用ACL。
setfacl -m u:特定用户名:rwx /shared/folder给某个特定用户读写执行权限。getfacl /shared/folder查看所有ACL条目。
一个简单的分配决策树
| 文件类型 / 场景 | 建议权限 (数字) | 原因 |
|---|---|---|
| 个人私密文件 | 600 或 700 |
仅自己可读写,最高安全。 |
| 普通共享文件 | 644 或 755 (目录) |
自己可写,他人只读。 |
| 脚本/程序 (个人) | 700 |
自己可读写执行。 |
| 脚本/程序 (共享) | 755 |
自己读写执行,他人只读执行。 |
| SSH 私钥 | 600 或 400 |
必须严格限制,否则SSH拒绝连接。 |
| Web 服务器目录 | 755 (目录) / 644 (文件) |
标准安全配置,网页可读,不可写。 |
| 敏感日志文件 | 640 或 600 |
防止普通用户查看敏感信息。 |
| 共享协作目录 | 2770 (SGID) 或 2775 |
充分协作,新文件自动归属正确组。 |
牢记两个黄金法则:
- 不要使用
777,除非你确信这个文件谁都能改(例如/tmp临时目录)。 - 先用
-l查看,再用-R递归:修改前看清楚当前权限,递归时务必确认范围,避免误操作。
希望这个系统性的讲解能帮助你理解并正确分配文件权限!如果还有具体场景需要进一步探讨,欢迎继续提问。
标签: 文件权限