chmod 是什么
chmod 修改文件与目录的权限位,每个文件有属主、属组、其他人三种身份,每种身份各有读、写、执行三位,另外还有 SUID、SGID、sticky 三个特殊位。两种表示方式各有适用场景:八进制(如 644、755)简洁直观,符号法(如 u+x、g-w)适合在现有权限上做增减。目录的语义与文件不同——目录的 x 是进入权限、r 是列目录、w 是改目录项,理解这点才能解释很多「权限看着对却进不去」的现象。
基本信息
| 适用平台 | Linux、macOS、BSD(GNU coreutils / BSD chmod);--reference、X 等写法两者都支持 |
|---|---|
| 命令语法 | chmod [选项] 模式 文件... |
| 模式写法 | 八进制三位或四位(644、755、2775、1777);符号法 [ugoa][+-=][rwxXst] |
| 常用选项 | -R 递归、-c 仅在变化时输出、-v 输出所有处理、--reference=参考文件 复制其权限、--preserve-root 拒绝对 / 递归 |
| 权限要求 | 只有文件属主或 root 能修改权限;属主可以给文件设置属组内的权限,但不能把属主改成别人 |
典型使用场景
- 发布可执行文件:给脚本与二进制加上执行位,用 755 或 u+x
- 收紧敏感文件:私钥、配置里的凭据文件设为 600,避免其他用户可读
- 共享目录协作:用 SGID 让新建文件继承目录属组,团队共享目录常用 2775
- 公共可写目录:/tmp 这类目录用 sticky 位防止用户互相删除文件
- 批量校正网站目录:目录 755、文件 644 是 Web 场景的常见基线
- 对照修复:用 --reference 把一个文件的权限套用到另一个文件,避免手工比对
常用示例
常用示例
chmod 644 index.html # rw-r--r--
chmod 755 /opt/app/bin/start # 可执行脚本
chmod 600 ~/.ssh/id_ed25519 # 私钥只允许属主读取
chmod u+x,g-w file # 符号法精调(多项用逗号分隔)
chmod -R g+rX /srv/shared # X:只给目录和已可执行文件加 x,批量共享目录的正确姿势
chmod 2775 /srv/team # SGID 目录:新建文件继承目录属组
chmod 1777 /tmp # Sticky:防止任意删除他人文件
chmod --reference=/etc/app/base.conf /etc/app/new.conf
stat -c '%a %U:%G %n' /srv/team数字与特殊位
| 数字 | 含义 | 典型用法 |
|---|---|---|
| 644 | 属主读写、其他只读 | 普通文件与网页文件 |
| 600 | 仅属主可读写 | 私钥、含凭据的配置 |
| 755 | 属主读写执行、其他读执行 | 程序目录与可执行脚本 |
| 700 | 仅属主可读写执行 | 用户家目录与私有目录 |
| 4/2/1 前缀 | SUID / SGID / sticky | 4755 慎用;2775 共享目录;1777 公共可写 |
| 775 | 属主与属组全权限、其他人读执行 | 团队共享且不需 SGID 时的备选 |
符号法里的 X 是批量操作的正确答案:chmod -R a+rX 只给目录(以及原本就可执行的文件)加执行位,不会把普通文本文件变成可执行文件。直接用 -R a+x 会给所有文件加上执行位,既是安全风险也容易引发误操作。
新建文件的权限受 umask 影响:常见 umask 022 下,文件默认 644、目录默认 755;umask 027 则对应 640 与 750。应用运行账号的 umask 会影响它创建的日志与上传文件权限,排查「文件权限为何是 640」时先看该账号的 umask。
SUID 让程序以属主身份运行,是提权类漏洞的常见载体;除 passwd、sudo 这类系统自带程序外,不要给自制脚本或程序加 SUID(脚本上的 SUID 在多数系统上本就会被忽略)。需要精细授权时优先用 sudo 规则或 ACL,而不是 SUID。批量改完权限后要用 stat -c '%a %U:%G %n' 文件 或 ls -l 抽查几个代表性条目,确认结果符合预期。
权限位与访问控制列表是两套机制:目录上配置了默认权限条目后,新建文件会继承这些条目,而修改基础权限位会改变掩码,从而连带影响列表中对应条目的实际有效权限。排查「明明看起来该有权却没有」的情况,要用查看列表的命令确认,别只盯着 rwx 符号。