第二周开始。上周你已经能查问题、改配置了,但有一类问题当时绕过去了——Permission denied。这周就解决它。
$ ls -l /etc/passwd
$ ls -ld /tmp # -d 看目录本身,不看里面
$ chmod 755 /tmp/lab/test.sh
$ chmod 644 /tmp/lab/test.txt
$ chmod +x /tmp/lab/test.sh
回到那十个字符
- 第 1 位
- 文件类型。
-普通文件,d目录,l软链接。它不是权限,别数进去。 - 第 2–4 位
- 属主(owner)的权限——文件归谁,谁就用这三位。
- 第 5–7 位
- 属组(group)的权限——属于这个组的成员用这三位。
- 第 8–10 位
- 其他人(other)的权限——不是属主、也不在组里的所有人。
从左到右,命中即停。你是属主 → 用属主那三位,后面两组跟你没关系了。
这解释了一个反直觉的现象:属主的权限比其他人还小时,属主反而做不了。比如 -r--rw-r--,属主只能读,哪怕组里的人能写。
rwx 到底是什么意思
大部分教程只说「r 读、w 写、x 执行」就过去了。但 rwx 对「文件」和「目录」的含义完全不一样——这是新手最容易栽的地方,也是面试的进阶题。
- r · 文件
- 能读文件内容(
cat、less得开)。 - r · 目录
- 能列出目录里有什么(
ls能出结果)。但仅此而已——不代表能访问里面的文件。 - w · 文件
- 能修改文件内容。
- w · 目录
- 能在目录里新建、删除、改名文件。注意:删一个文件看的是目录的 w,不是文件自己的权限。
- x · 文件
- 能执行它(脚本、程序)。普通文本文件不需要这个。
- x · 目录
- 能进入这个目录(
cd进得去),也是访问里面文件的前提。
目录没有 x,你就进不去,里面的文件一个都碰不到——哪怕那些文件本身权限是 777。
反过来,目录只有 x 没有 r:你 ls 不出内容(不知道里面有啥),但如果你确切知道文件名,照样能访问。
所以目录权限里 r 和 x 通常要一起给,这就是为什么目录默认是 755 而不是 744。
数字怎么来的
r = 4 w = 2 x = 1 - = 0
# 每一组把有的加起来,三组凑成三位数
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
rwx r-x r-x → 755 属主全权,其他人能读能进
rw- r-- r-- → 644 属主可改,其他人只读
rwx --- --- → 700 只有属主能用,别人完全碰不到
rw- --- --- → 600 只有属主能读写
rwx rwx rwx → 777 所有人全权 —— 别用
755 给目录和脚本(要能进、能执行),644 给普通文件(不需要执行)。
这两个覆盖你 90% 的场景。剩下的等遇到了再查。
chmod
$ chmod 755 /tmp/lab/test.sh # 直接定成 rwxr-xr-x
$ chmod 644 /tmp/lab/test.txt
$ chmod -R 755 /tmp/lab/ # -R 递归,整个目录树
$ chmod +x test.sh # 所有人都加执行权限
$ chmod u+x test.sh # u=属主 只给属主加
$ chmod g-w test.txt # g=属组 去掉组的写权限
$ chmod o-r secret.txt # o=其他人 不让别人读
$ chmod a+r public.txt # a=所有人
数字法:你清楚知道最终要什么权限,一步到位。写脚本、做部署时用它。
符号法:只想动一个点,别的保持不变。最典型的就是 chmod +x 给脚本加执行权限——第 26 天你会天天用。
为什么不该用 777
新手遇到 Permission denied,最快的"解决"办法就是 chmod 777。**它确实能让问题消失——但那是把问题盖住,不是解决。**
而且有些场景 777 会直接让功能失效,不是安全问题,是根本用不了:
# SSH 对密钥文件的权限有强制要求,太开放它就拒绝工作
$ chmod 700 ~/.ssh # 目录必须 700
$ chmod 600 ~/.ssh/authorized_keys # 公钥文件必须 600
$ chmod 600 ~/.ssh/id_rsa # 私钥必须 600
# 权限太开时的报错:
Permissions 0644 for '/home/devops/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
密钥登录配不通,十次有三次是权限的问题。记住 .ssh 是 700、里面的文件是 600,能省你很多时间。
顺带一提 umask
你 touch 一个新文件,默认是 644;mkdir 一个新目录,默认是 755。这个默认值是 umask 决定的。
$ umask
0022
# 原理:从最大权限里「减掉」umask
# 目录 777 - 022 = 755
# 文件 666 - 022 = 644 (文件默认不给 x,所以是 666 起步)
今天知道有这么回事就够了,不用背。面试偶尔会问一句"新建文件默认权限怎么来的",能说出 umask 这个词就行。
今天的面试点
「属主读写执行,属组和其他人只能读和执行。」
补一句会更好:「目录必须有 x 才能进得去,所以目录一般给 755 而不是 744。」
这是进阶题,答对能明显加分。
「目录的 x 是进入权限。没有 x 就 cd 不进去,里面的文件一个都访问不了,哪怕文件本身是 777。而 r 只管能不能 ls 出列表——所以目录的 r 和 x 通常要一起给。」
这是道送命题,别答"会"。
「不会。777 是把问题盖住而不是解决,而且有些场景反而会失效——比如 SSH 的密钥文件权限太开,它会直接拒绝登录。我一般是先 ls -l 看属主和权限,id 确认当前用户在哪些组,按最小权限来调。」
今天的练习
ls -l /etc/passwd,把那十个字符念出来:什么类型、三组各是什么权限ls -ld /tmp,看看/tmp是几,想想为什么它跟别的目录不一样(末尾那个t先不用管)- 建个文件
touch /tmp/lab/p.txt,ls -l看默认是不是 644 - 建个目录
mkdir /tmp/lab/pd,ls -ld看默认是不是 755,再umask对一下 - 重点实验:
chmod 644 /tmp/lab/pd(去掉目录的 x),然后试cd /tmp/lab/pd—— 看它怎么拒绝你,然后chmod 755改回来 - 用符号法练一次:
chmod u+x再ls -l看变化,然后chmod u-x改回去
Day 07 讲属主和属组——权限管「能做什么」,属主属组管「你是谁」。两者合起来才是完整的判断。
明天还会讲一个真实场景:网站报 403 打不开,怎么按顺序排查。