chmod 与 chown 入门:看懂 Linux 文件权限,别再随手 777
部署时遇到 Permission denied,很多人的第一反应是 chmod -R 777,报错确实消失了,但任何用户都能改写甚至替换这些文件。其实 Linux 权限只有几条规则,看懂之后,大多数问题用一两条精确的命令就能解决。下面的文件名、用户名和输出都是人为构造的小样本,示例输出只由这些假设推导,不代表任何真实机器的实测结果。
一、先读懂 ls -l 的那一串字符
假设目录里有一个脚本和一个配置文件,执行 ls -l 后看到下面两行(示例):
-rwxr-x--- 1 alice dev 210 Nov 9 10:00 deploy.sh
-rw-r--r-- 1 alice dev 120 Nov 9 10:00 app.conf
第一个字符表示类型,- 是普通文件,d 是目录。后面九个字符每三个一组,依次对应属主(u)、属组(g)和其他人(o)。r 是读,w 是写,x 是执行。第三、四列 alice 和 dev 就是属主和属组。所以 deploy.sh 的含义是:alice 可读写执行,dev 组成员可读和执行,其他人什么都不能做。
用 stat 可以直接看到数字形式,便于核对:
stat -c '%a %U:%G %n' deploy.sh app.conf
按上面的假设,输出应为 750 alice:dev deploy.sh 和 644 alice:dev app.conf 两行。
二、chmod:数字写法和符号写法
数字写法里 r=4、w=2、x=1,每组相加得到一位数字。rw- 是 6,r-x 是 5,r-- 是 4。因此:
chmod 640 app.conf # 属主读写,组只读,其他人无权限
chmod u+x deploy.sh # 只给属主加执行权限,其余位不变
chmod o-r app.conf # 去掉其他人的读权限
符号写法的好处是只改动你点名的那一位,不会顺手把其他位覆盖掉,适合“只想补一个 x”这类场景。
需要特别注意目录:目录的 x 表示“能否进入并访问其中的文件”,r 表示“能否列出文件名”。一个目录只有 r 没有 x,ls 能看到名字,却打不开里面的文件。所以网站目录常见的组合是目录 755、文件 644,而不是全部 777。
三、chown:改属主和属组
权限位决定“这一类人能做什么”,chown 决定“这个文件归谁”。修改属主通常需要 root 权限:
sudo chown www-data:www-data /srv/site/upload
sudo chown -R alice:dev /srv/app
冒号前是用户,冒号后是组;只写 :dev 表示只改组。-R 会递归处理整个目录,执行前先确认路径没有写错,尤其不要对 / 或家目录误操作。
四、为什么不要随手 777
777 意味着机器上任何账号、任何被攻破的进程都能写入这个文件或目录。对 Web 上传目录来说,这可能让别人放进可执行脚本。更好的排查顺序是:
- 先用 ps 或服务配置确认程序以哪个用户运行,比如 www-data。
- 用 ls -ld 逐级检查路径上每个目录是否有 x 权限。
- 优先用 chown 把文件交给正确的用户或组,再给最小够用的权限。
- 批量修正时区分文件和目录,例如下面两条:
find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +
新建文件的默认权限由 umask 决定,常见的 022 会让新文件是 644、新目录是 755。权限问题解决后,记录下你改了哪些路径和数值,下次部署就能照着复现,而不是再碰一次运气。
- 点赞
- 收藏
- 关注作者
评论(0)