前言
在Linux服务器上部署应用时,你是否遇到过这样的报错:Permission denied(权限被拒绝)?
很多新手遇到这个问题,第一反应就是简单粗暴地执行 chmod 777。虽然这能解决问题,但这就像为了进家门方便,把大门的锁直接拆了一样——极其危险。
作为一个专业的开发者,我们必须深刻理解 Linux 的权限体系。今天我们就来彻底拆解 chmod 和 chown 这两个命令。
1. 读懂 ls -l 的天书
在终端输入 ls -l,你会看到类似下面的一串字符:
Bash
drwxr-xr-x 2 root root 4096 Jan 1 12:00 my_folder -rw-r--r-- 1 root root 123 Jan 1 12:00 config.txt
这串字符 drwxr-xr-x 到底是什么意思?我们把它拆成 4 部分来看:
- 第1位(文件类型):
d:代表目录 (Directory)-:代表文件
- 第2-4位(属主权限 User): 文件拥有者(Owner)能做什么。
- 第5-7位(属组权限 Group): 和拥有者同组的用户能做什么。
- 第8-10位(其他权限 Others): 其他所有人能做什么。
其中,r、w、x 的含义如下:
- r (Read): 读权限。
- w (Write): 写权限(修改、删除)。
- x (Execute): 执行权限(对于脚本是运行,对于目录是进入)。
2. chmod:修改权限的神器
chmod (Change Mode) 用于改变文件的读写执行权限。最常用的是**“数字法”**。
Linux 将权限赋予了数字含义,这是一个加法游戏:
- r = 4
- w = 2
- x = 1
常见的权限组合:
- 7 (4+2+1): 读 + 写 + 执行 (最高权限)
- 6 (4+2): 读 + 写 (不能执行)
- 5 (4+1): 读 + 执行 (不能修改)
- 4: 只读
记住这 3 个黄金组合:
1. chmod 755 —— 脚本和程序的标配
- 解析: 属主(7=RWX),组用户(5=RX),其他人(5=RX)。
- 场景: 这是一个可执行脚本,或者网站的目录。你可以任意修改,别人只能看和运行,不能乱改。
Bash
chmod 755 start.sh
2. chmod 644 —— 配置文件/网页文件的标配
- 解析: 属主(6=RW),组用户(4=R),其他人(4=R)。
- 场景: 比如
nginx.conf或index.html。这些文件不需要执行,只需要能被读取即可。
Bash
chmod 644 index.html
3. chmod 600 —— 隐私文件的标配(如SSH密钥)
- 解析: 属主(6=RW),其他人(0=无权限)。
- 场景: 你的私钥文件
id_rsa。这是最高机密,除了你自己,谁都不能看,否则SSH会强制报错拒绝连接。
Bash
chmod 600 ~/.ssh/id_rsa
3. chown:物归原主
有时候权限是对的(比如755),但依然报错 Permission denied,为什么? 因为文件的主人不对。
比如你用 root 账号上传了网站代码,但 Nginx 服务是用 www 或 nginx 用户运行的。Nginx 想要读取文件,发现主人是 root,且 root 没给它权限,自然就报错了。
这时候需要用 chown (Change Owner) 来修改文件的拥有者。
语法: chown 用户:用户组 文件路径
实战场景:将 /data/wwwroot 目录下的所有文件,归还给 nginx 用户。
Bash
# -R 代表递归(Recursive),连同目录下的所有子文件一起修改 chown -R nginx:nginx /data/wwwroot
4. 警惕:为什么永远不要用 chmod 777?
chmod -R 777 /var/www 是很多教程里的“大坑”。
这意味着任何人(包括黑客上传的恶意脚本)都可以在你的服务器上修改、删除、执行这个目录下的文件。如果你的网站有上传漏洞,黑客上传一个木马并执行,你的服务器就沦陷了。
原则:永远只给刚好够用的权限(Least Privilege)。
总结
- chmod 管的是“能做什么”(读、写、执行)。
- chown 管的是“谁能做”(你是主人吗?)。
- r=4, w=2, x=1,口诀记心间。
- 善用 755 (脚本/目录) 和 644 (普通文件),远离 777。