讲解
Linux 是多用户系统,每个文件都有三组权限,分别作用于三类人:文件所有者(user)、所属组(group)、其他人(others)。每组权限由三个字母组成:r 读(4)、w 写(2)、x 执行(1)。ls -l 输出第一列的 -rw-r--r-- 就是权限位:第一个字符是类型(- 普通文件,d 目录),后面九个字符每三个一组。
chmod 修改权限,有两种写法。数字法把每组权限的数字相加:rwx 是 7、rw- 是 6、r-- 是 4,所以 chmod 644 file 表示「所有者可读写、其他人只读」,chmod 755 script.sh 是「所有者全权、其他人可读可执行」——755 和 644 覆盖了 90% 的日常场景。符号法更直观:chmod u+x script.sh 给所有者加执行权限,chmod go-w file 去掉组和其他人的写权限,u/g/o/a 分别代表所有者/组/其他人/所有人。
目录的权限含义要单独记:目录的 r 是「能列出里面有什么」,x 是「能进入并访问里面的文件」,w 是「能在里面增删文件」。所以一个目录光有 r 没有 x,你能 ls 出文件名却打不开任何文件。另外 -R 选项可以递归修改整个目录树的权限,慎用——目录通常要 755 而文件要 644,一刀切递归会制造混乱。
示例
# 刚创建的脚本没有执行权限
ls -l hello.sh
# 符号法:给所有者加执行权限,然后就能运行了
chmod u+x hello.sh
ls -l hello.sh
./hello.sh
# 数字法:普通文件 644,私密文件 600
chmod 644 notes.txt
echo "机密内容" > secret.txt
chmod 600 secret.txt
ls -l notes.txt secret.txt
# 去掉所有人的写权限,等于只读保护
chmod a-w report.txt
ls -l report.txt
常见坑
- 脚本 Permission denied:新脚本忘了 chmod +x。这是每个 Linux 用户都会至少遇到一次的仪式。
- 图省事 chmod 777:所有人可写可执行是安全隐患,尤其是网站目录。先想清楚谁需要什么权限,最小授权。
- 目录没 x 进不去:chmod -x 了目录之后 cd 不进去、里面文件也访问不了,哪怕文件本身权限正常。
- chmod -R 一刀切:递归把目录和文件都设成 755 后,普通文件白白带上执行权限。目录和文件应该分开处理。
小结
权限分所有者/组/其他人三组,r=4、w=2、x=1;数字法记 644 和 755,符号法记 u+x;目录的 x 是「进入」权限。下一节讲权限的另一半:所有者与 sudo。