马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
写的什么: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 |
| 4 | r-- 读 | 4 |
| 5 | r-x 读+执行 | 4+1 |
| 6 | rw- 读+写 | 4+2 |
| 7 | rwx 读+写+执行 | 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 发行版,实际权限请按业务最小必要原则设置。) |