chmod(change mode)用来修改文件或目录的权限——谁能读、谁能写、谁能执行。用到它的场景不少:下载的脚本要先 chmod +x 才能直接跑、SSH 私钥权限太开放会被直接拒连、Web 目录要给运行用户开写权限。要用好它,得先看得懂权限是怎么表示的。
权限怎么看:从 ls -l 说起
$ ls -l example.txt
-rw-r--r-- 1 user staff 0 Aug 19 10:00 example.txt
第一个字符是文件类型:- 普通文件,d 目录,l 软链接。后面九个字符每三个一组,从左到右依次是:
- 属主(user):文件属于谁,对应上面的
user - 属组(group):文件属于哪个组,对应
staff - 其他人(others):既不是属主、也不在属组里的所有人
每组内三个位置固定:r 读、w 写、x 执行,没有的权限用 - 占位。比如 rwx 是三项全有,rw- 是能读写、不能执行。
注意同一权限对文件和目录含义不一样,这是最容易迷糊的地方:
| 权限 | 对文件 | 对目录 |
|---|---|---|
r |
读文件内容 | 列出目录下有哪些文件(ls) |
w |
修改文件内容 | 在目录里新建、删除、重命名文件 |
x |
执行它 | 进入目录(cd)、访问里面的文件 |
所以目录权限里那个 x 是“允许进入”,不是“允许执行”。一个目录哪怕给了 r,没给 x 也只能看到文件名,打不开、进不去。
符号法
格式是 chmod [谁][怎么改][什么权限] 文件,三个部分各有取值:
- 谁:
u属主、g属组、o其他人、a所有人,可以组合使用(如ug) - 怎么改:
+加上、-去掉、=直接设成指定的权限(没提到的位会被清掉) - 什么权限:
r、w、x
chmod u+x example.sh # 给属主加执行权限
chmod g-w example.txt # 去掉属组的写权限
chmod o=r example.txt # 其他人设为只读,原来如果有 w 也一并清掉
chmod ug+w example.txt # 属主和属组一起加写权限
chmod a+r example.txt # 所有人加读权限
省略“谁”时默认作用于 a,所以最常见的 chmod +x script.sh 就是 chmod a+x 的简写。
两个实用参数:
-R:递归处理目录下的所有内容。- 大写
X:只给目录加执行权限;文件只有本来就可执行时才加。批量调整时用它代替x不会把普通文件误设成可执行:chmod -R u+rwX dir。
数字法
三位数字从左到右对应属主、属组、其他人,每位数字是三个权限的加和:r=4、w=2、x=1。
每位数字的速查:7=rwx、6=rw-、5=r-x、4=r--、0=---。
chmod 755 deploy.sh # 属主 rwx,组和其他 r-x:自己随便改,别人能看能执行
chmod 644 notes.txt # 属主 rw-,组和其他 r--:普通文件最常见的一档
chmod 700 ~/.ssh # 只有属主能进,私有目录
chmod 600 ~/.ssh/id_ed25519 # 私钥必须是这个权限,太开放 ssh 会拒绝使用
数字法一次覆盖全部九个位,没写到的位等于清零;符号法只动指定的位,不影响其他位。所以增量调整用符号法,明确设成某一档权限用数字法。
一个完整例子
对着同一个文件连续操作,看权限怎么一步步变化:
$ touch example.txt && chmod 644 example.txt
$ ls -l example.txt
-rw-r--r-- 1 bozhou staff 0 Aug 19 10:00 example.txt
$ chmod u+x example.txt # 属主加执行
-rwxr--r--
$ chmod g-r example.txt # 去掉属组的读权限
-rwx---r--
$ chmod 755 example.txt # 数字法一次设成
-rwxr-xr-x
特殊权限位
九个基本位之外还有三个特殊权限,数字法里以第四位开头出现:setuid=4、setgid=2、sticky=1。
- setuid(4000):文件执行时以属主身份运行。典型例子是
/usr/bin/passwd(4755)——普通用户靠它去改 root 拥有的/etc/shadow。符号法:chmod u+s file。 - setgid(2000):文件以属组身份执行;用在目录上时,里面新建的文件会自动继承目录的属组,团队共享目录常用。符号法:
chmod g+s dir。 - sticky(1000):粘滞位,设在目录上后每个人只能删自己的文件。
/tmp就是 1777,所有人可写但互删不了。符号法:chmod +t dir。
显示上它们占用 x 的位置:x 变小写 s 表示 setuid/setgid(如 rwsr-xr-x),目录的 x 变 t 表示 sticky(如 drwxrwxrwt)。如果原来没有 x,则显示大写 S/T。
顺带一提
chmod只改权限,改属主用chown(chown user:group file),只改属组用chgrp。- 只有文件的属主和 root 能改它的权限,动别人的文件要加
sudo。 - 看目录本身的权限要加
-d:ls -ld /tmp,否则看到的是目录里内容的列表。
参考
man chmod- GNU Coreutils 手册:chmod

评论 0
可以先写评论,登录后草稿会自动恢复。