Skip to content

永远别用 chmod 777:从底层揭开 Linux 权限的 UGO 铁三角

毛佳国

每一个从 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 位的权限字符组成的。

所以 -rw-r--r-- 的意思是: 这是一个普通文件(-),它的主人(root)可以读和写(rw-),和主人在同一个群组里的人只能读(r--),路过看热闹的其他人也只能读(r--)。

没有任何人可以 x(执行)这个文件。如果你写了个 .sh 脚本,它是这副模样,肯定跑不起来。你需要:chmod u+x script.sh

第二把钥匙:神秘的八进制数字

很多教程教你用数字设置权限,比如大名鼎鼎的 777。这是哪里来的?

其实就是把上面那些 rwx,用二进制(有就是 1,没有 - 就是 0)转成了八进制数字:

如果你想让拥有者可读(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。正确姿势是对目录给 700755,对普通文件给 644

掌握了 chmod(改权限的掩码) 和 chown(改物品的归属),你才是真正摸到了 Linux 系统级安全架构的门把手。

上一篇
告别 Screen 与 Nohup:用 Systemd 优雅地管理你的全部后台程序
下一篇
什么是软路由?OpenWrt 新手入坑完全指南