每一个从 Windows 转到 Linux 敲了一段时间命令的人,肯定经历过这种崩溃:
跑一个脚本,终端冷冰冰地弹出一句:Permission denied。
在 Nginx 里配置了一个新的静态网页目录,打开页面是一个惨白的:403 Forbidden。
你想编辑一下 /etc 目录下的某行配置文件:E212: Can't open file for writing。
为了尽快解决报错接着干活,无数新手在网上搜到了一副剧毒的“包治百病万能药”:
sudo chmod -R 777 /xxx。
世界似乎一下子清净了。 但是如果你在实习期敢把这行命令敲进生产环境的数据库目录,你的职业生涯也很可能走到头了。因为你的世界清净了,黑客的世界也同样为你狂欢。
在 2024 年,让我们痛下决心,彻底戒掉 777。搞懂 Linux 权限这本难念的经。
权限的铁三角(UGO 架构)
Linux 的世界里,所有的东西都被三种身份隔离得死死的:U (User,拥有者)、G (Group,所在组的其他人)、O (Others,无关的陌生人)。
当你使用 ls -l 去查看一个文件时,你会看到类似这样的一串密语:
-rw-r--r-- 1 root root 1234 May 22 14:30 config.json
这串密语怎么解?
第一把钥匙:十个字符的秘密
我们只看最前面这一串 -rw-r--r--,实际上它是由 1 个表示类型的字符和 3 组各占 3 位的权限字符组成的。
- 第 1 位:一般是
-(普通文件) 或者d(这是一个目录 Directory)。 - 第 2-4 位:这是 U (当前属主 User) 的权限组合:可读 (
r)、可写 (w)、可执行 (x)。 - 第 5-7 位:这是 G (同组用户 Group) 的权限。
- 第 8-10 位:这是 O (不认识的路人 Other) 的权利。
所以 -rw-r--r-- 的意思是:
这是一个普通文件(-),它的主人(root)可以读和写(rw-),和主人在同一个群组里的人只能读(r--),路过看热闹的其他人也只能读(r--)。
没有任何人可以 x(执行)这个文件。如果你写了个 .sh 脚本,它是这副模样,肯定跑不起来。你需要:chmod u+x script.sh。
第二把钥匙:神秘的八进制数字
很多教程教你用数字设置权限,比如大名鼎鼎的 777。这是哪里来的?
其实就是把上面那些 rwx,用二进制(有就是 1,没有 - 就是 0)转成了八进制数字:
r(Read) -> 2 的 2 次方 = 4w(Write) -> 2 的 1 次方 = 2x(Execute) -> 2 的 0 次方 = 1
如果你想让拥有者可读(4)、可写(2)、可执行(1),那就是 4 + 2 + 1 = 7。
如果你想让所在组的人只能读(4)和执行(1),写不了(0),那就是 4 + 0 + 1 = 5。
这就是数字权限运算的基本法!
常规踩坑的自我拯救指南
1. Nginx 报 403 Forbidden 怎么办?
不要 777。想一想,Nginx 的工作进程通常是以 www-data 或者 nginx 身份运行的。而你刚下载的网页文件可能属于 root,并且默认没有给 Others 写的权限。
此时正确的做法是交出所有权 (Change Owner):
sudo chown -R www-data:www-data /var/www/html
把属于 root 的房子,过户给负责对外服务的 www-data 就可以了!
2. 文件夹的执行权限 x 是什么鬼?
对于文件,x 表示能像程序一样跑起来。
但对于目录,如果没有 x 权限,你甚至连 cd 进入这个目录都不行!
如果你有一个存放敏感照片的目录,并且你设置了 chmod 600 private_folder(读写都有,但去掉了强悍的执行权限),恭喜你,你会发现你自己都打不开这个文件夹了。因为文件夹的最小进入门槛,必须包含一个 x。正确姿势是对目录给 700 或 755,对普通文件给 644。
掌握了 chmod(改权限的掩码) 和 chown(改物品的归属),你才是真正摸到了 Linux 系统级安全架构的门把手。