返回文章列表

chmod命令详解

分类
标签
SilentBlade
SilentBlade
2024-05-20 3 分钟阅读 136 阅读

chmod(change mode)用来修改文件或目录的权限——谁能读、谁能写、谁能执行。用到它的场景不少:下载的脚本要先 chmod +x 才能直接跑、SSH 私钥权限太开放会被直接拒连、Web 目录要给运行用户开写权限。要用好它,得先看得懂权限是怎么表示的。

权限怎么看:从 ls -l 说起

text
$ 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
  • 怎么改:+ 加上、- 去掉、= 直接设成指定的权限(没提到的位会被清掉)
  • 什么权限:rwx
bash
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=4w=2x=1

每位数字的速查:7=rwx6=rw-5=r-x4=r--0=---

bash
chmod 755 deploy.sh   # 属主 rwx,组和其他 r-x:自己随便改,别人能看能执行
chmod 644 notes.txt   # 属主 rw-,组和其他 r--:普通文件最常见的一档
chmod 700 ~/.ssh      # 只有属主能进,私有目录
chmod 600 ~/.ssh/id_ed25519   # 私钥必须是这个权限,太开放 ssh 会拒绝使用

数字法一次覆盖全部九个位,没写到的位等于清零;符号法只动指定的位,不影响其他位。所以增量调整用符号法,明确设成某一档权限用数字法。

一个完整例子

对着同一个文件连续操作,看权限怎么一步步变化:

bash
$ 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),目录的 xt 表示 sticky(如 drwxrwxrwt)。如果原来没有 x,则显示大写 S/T

顺带一提

  • chmod 只改权限,改属主用 chownchown user:group file),只改属组用 chgrp
  • 只有文件的属主和 root 能改它的权限,动别人的文件要加 sudo
  • 看目录本身的权限要加 -dls -ld /tmp,否则看到的是目录里内容的列表。

参考

评论 0

访
暂无评论,来发表第一条评论吧。