Linux———chmod命令详解(狠狠爱住)

[复制链接]
发表于 2026-10-3 15:59:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

写的什么:chmod 是干什么的

在 Linux 里,每个文件和目录都有一张"谁能对我干什么"的权限表。chmod(change mode 的缩写)就是改这张表的命令,名字是 change mode 的组合。

权限分三种动作:读、写、执行,对应字母 r / w / x:

  • r(read,读):允许读取文件内容;对目录来说,是允许列出目录里的条目。
  • w(write,写):允许修改、编辑文件内容;对目录来说,是允许在目录里新建或删除条目。
  • x(execute,执行):对文件来说,允许作为可执行程序运行;对目录来说,是允许进入该目录。

再看权限的"对象",一共三类(也可以叫两方半):

  • u(user):文件或目录的所有者(owner)。
  • g(group):文件或目录所属的组。
  • o(others):除了 owner 和所属组之外的其他所有人。

把三类对象 × 三种动作组合起来,就有了 Linux 权限体系的基础。

写法一:用字母表达式

基本格式:

chmod [对象][操作符][权限] 文件...

操作符只有三个:

  • +:增加指定权限
  • -:取消指定权限
  • =:直接设定,覆盖原有权限

对象字母也可以用 a(all,即 u、g、o 全部)代劳。

例子

把 file.txt 的 owner 和 group 设为读写、不可执行,其他用户不给任何权限:

chmod u=rw,g=rw,o= file.txt

把文件 owner 的执行权限去掉:

chmod u-x file.txt

把 group 的写权限去掉(只剩读):

chmod g-w file.txt

给其他人加上执行权限:

chmod o+x file.txt

给所有人加上执行权限:

chmod a+x file.txt

一次性把 owner 和 group 的读写都去掉:

chmod ugo-rw file.txt    # 也可以写成 chmod a-rw file.txt

不管原来是什么,直接把 owner 权限钉死成读写:

chmod u=rw file.txt

写法二:用数字(最常用)

实际运维里写得最多的还是三位数字,比如 chmod 644 file.txt。它把每类对象的权限压缩成一个 0–7 的数字。

三位数字从左到右依次是:owner(u)、group(g)、others(o)。

每个数字由三位二进制位相加得到:

数值权限拆解
0无权限—
1--x 执行1
2-w- 写2
3-wx 写+执行2+1
4r-- 读4
5r-x 读+执行4+1
6rw- 读+写4+2
7rwx 读+写+执行4+2+1

所以 chmod 644 file.txt 表示:owner 读写(6),group 只读(4),others 只读(4)——用 ls -l 看就是 -rw-r--r--。

几个高频数值背下来能省不少事:

  • 644:普通数据文件(读写属主,其他人只读)。
  • 755:脚本、可执行程序、目录(能进能看能跑)。
  • 600:私钥、密码文件、数据库 dump,只有属主能读写。
  • 700:只有属主能进的目录,比如用户的 ~/.ssh。
  • 777:谁都读写执行——生产环境基本等于裸奔,除了临时测试容器,不要长期用。

常用选项

  • -R:递归,把目录及其所有子目录、子文件一并改掉。
  • -v:verbose,详细列出每个文件权限被改成了什么。
  • -c:只在权限真的发生变化时才输出信息(本来就是目标权限的那批不报)。
  • -f:静默,不打印错误信息(比如遇到没有权限的文件直接跳过,不刷屏)。

带选项的例子

chmod -R a+rw parent        # 递归给 parent 及子树全部用户加读写
chmod -v ug+x file.txt      # 给属主和组加执行,并打印修改详情
chmod -c u-w file.txt       # 去掉属主写权限,只有真改了才提示
chmod -f ugo-w file         # 去掉所有人的写权限,忽略不存在的文件等报错

数字前面还能加一位:特殊权限

四位数字写法里,最左边那一位是特殊权限位,很多人第一次看到会懵:

  • 4(SUID):setuid,执行该文件时以文件属主的身份跑(比如 /usr/bin/passwd 让普通用户能改自己的密码)。
  • 2(SGID):setgid,对目录来说,在该目录新建的文件自动继承目录的属组。
  • 1(sticky,粘滞位):只对目录有效,比如 /tmp,任何人都能往里写,但只能删自己创建的文件,不能删别人的。
chmod 4755 ./suid_bin      # 加 SUID
chmod 2755 /data/team      # 目录设 SGID,组内共享写
chmod 1777 /tmp            # 经典粘滞位目录
提醒:SUID/SGID 是可被提权利用的危险位,服务器上不该出现来历不明的 SUID 文件。定期排查:
find / -perm /4000 -type f 2>/dev/null

几个实战场景

情景一:755 配目录、644 配文件。网站目录常见写法:

find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# 只要是脚本再单独放开执行位
chmod +x /var/www/html/deploy.sh

情景二:只给某组同事写权限。把用户加进组,再给目录设 sgid + g+w:

usermod -aG devops alice
chmod 2775 /srv/project
chown -R root:devops /srv/project

这样 team 里的成员都能在目录里建文件(sgid 保证新文件自动属于 devops 组),而不会互相删掉对方的文件(sticky 只在 /tmp 常用,需要对等场景可加)。

情景三:SSH 私钥必须 600。私钥太开放,SSH 会直接拒绝使用:

chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh

容易踩的坑

  • 改目录权限别漏了 x 位。目录的 x 是"能否进入",把目录改成 644 后用户进不去了,常见报错是 Permission denied 或 No such file or directory(其实是进不去而非文件不存在)。
  • -R 慎用 777。递归改大范围权限,一旦命令路径写错,整棵树都会废掉。改之前最好先 ls -ld 确认一下路径。
  • umask 决定默认值。新建文件的初始权限不是 666,而是 666 减去 umask(通常 022,所以文件默认 644、目录默认 755)。想改默认值改 ~/.bashrc 里的 umask 或 /etc/profile。
  • root 不受权限位限制。root(以及 CAP_DAC_OVERRIDE 的进程)可以越过大部分权限检查,所以"权限没改对但还是能读"通常不是 chmod 的问题。
  • chown 和 chmod 是两码事。改属主要用 chown user:group file,别把改属主和改权限搅在一起。

小结

chmod 是 Linux 权限管理的基础工具:字母写法(u/g/o/a + + - = + r w x)适合微调,数字写法(如 644、755、600)适合批量与脚本,前面再加一位可设 SUID(4)/SGID(2)/sticky(1)。常用选项 -R 递归、-v 看详情、-c 只看变更、-f 静默。

记忆口诀很简单:读 4、写 2、执行 1,三类对象各一位,加起来就是那个数字。真正要守的底线是别随手 777——生产上权限松一格,被利用的往往就是那一格。

(本文由 qidao123.com企服评测-应用市场 编辑提示整理:命令基于 GNU coreutils,适用于 Ubuntu / Debian / CentOS / openEuler 等主流 Linux 发行版,实际权限请按业务最小必要原则设置。)

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表