chmod 命令速查表 - Linux 文件权限管理常用命令大全
权限出问题的现场往往只有一句 "Permission denied",成因却可能是位序算错、目录漏了 x、属组没对齐,或 umask 悄悄改掉了新建文件的默认值。读懂 owner/group/others 三元组加上 SUID/SGID/Sticky 三个特殊位之后,ls -l 那九位字符就不再是符咒,而是能直接口算的表达式。这张表用数字模式与符号模式左右对照同一组权限,每种写法都标出落在哪一位;特殊权限单列,因为它们改的不是「谁能读写」而是「权限怎么被赋予」——SUID 让程序以文件属主身份运行,SGID 让目录里新建的文件继承属组,Sticky 让共享目录里只有属主能删自己的文件。什么时候该翻它:脚本加了 x 仍然跑不起来、日志目录写不进去、SSH 拒绝加载私钥。跟 setfacl 相比它表达力有限,但可移植性最好,也是部署脚本唯一认得的形式
典型使用场景
面向管理 Linux 文件权限的开发者与运维。权限位的核心是三件事:数字模式 r=4 / w=2 / x=1 相加、符号模式用 u/g/o/a 做加减、以及目录上的 x 含义与文件完全不同(目录的 x 表示「可进入」,没有 x 即使有 r 也 cd 不进去)。本表覆盖数字模式、符号模式、特殊权限(SUID / SGID / Sticky)、常见组合与 umask,重点标出 777 与 600 这两个该用与不该用的极端值。
权限说明 Permission Bits 6
r (read)w (write)x (execute)- (no permission)u g oa数字模式 Numeric Mode 6
chmod 755 filechmod 644 filechmod 700 filechmod 600 filechmod 777 filechmod 750 dir符号模式 Symbolic Mode 6
chmod u+x filechmod go-w filechmod a+r filechmod u=rw,go=r filechmod +x script.shchmod -R 755 dir/特殊权限 Special Permissions 6
chmod u+s file (4755)chmod g+s dir (2755)chmod +t dir (1777)chmod 4755 filechmod 2755 dirchmod 1777 dir常见权限组合 Common Patterns 6
644755600640700750关联命令 Related Commands 7
chmod --reference=file1 file2chown user filechown user:group filechown -R user:group dir/chgrp group fileumask 022umask -S参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
r / w / x | 读 4 / 写 2 / 执行 1 | rwx = 4+2+1 = 7 |
u / g / o / a | 所有者 / 组 / 其他人 / 全部 | a 等价于 ugo |
755 | 可执行文件与目录的标准权限 | chmod 755 script.sh |
644 | 普通文件:所有者读写,他人只读 | chmod 644 config.yaml |
600 | 仅所有者读写,私钥标准权限 | chmod 600 ~/.ssh/id_rsa |
640 | 配置文件:所有者读写,组只读 | chmod 640 /etc/shadow |
700 / 750 | 私有目录 / 共享目录 | chmod 750 /opt/app |
u+x / go-w / a+r | 符号模式加减单个权限 | chmod u+x entrypoint.sh |
u=rw,go=r | 符号模式直接设置(等于覆盖) | chmod u=rw,go=r file |
chmod -R | 递归修改目录下所有内容 | chmod -R 755 dist/ |
u+s (4755) | SUID:执行时以所有者身份运行 | chmod 4755 /usr/bin/ping |
g+s (2755) | SGID:目录内新建文件继承组 | chmod 2755 /shared |
+t (1777) | Sticky:他人只能删自己的文件 | chmod 1777 /tmp |
--reference | 参照另一个文件的权限设置 | chmod --reference=file1 file2 |
umask | 新建文件的默认权限掩码 | umask 022 |
易错点与避坑指南
现象目录已经 chmod 755 了,但 cd 进去报 Permission denied。
原因缺少 x 权限时无法进入目录,即使同时有 r 权限(r 只影响能否列出目录内容)。
处置补上执行位:chmod u+x dir(目录通常需要 755)。
现象chmod 777 之后服务反而起不来了。
原因全权限会让安全模块(如 SELinux、AppArmor)与部分程序拒绝执行;也扩大了被篡改风险。
处置按最小权限原则改回 755 或 640;程序无法执行时先查 SELinux 日志而不是加权限。
现象SSH 提示 UNPROTECTED PRIVATE KEY FILE 而拒绝登录。
原因私钥权限过宽(group 或 other 有任何权限都会被拒绝)。
处置chmod 600 ~/.ssh/id_rsa,同时目录需要 700。
现象chmod -R 之后整个目录树权限被改乱,难以恢复。
原因递归把本该不同的权限统一了(如把 600 的私钥也改成 644)。
处置递归前先备份;改用 --reference 或按目录逐层设置,避免无差别 -R。
现象给脚本加了 +x 之后 ./script.sh 仍报 Permission denied。
原因缺少解释器声明(shebang),内核不知道该用什么执行。
处置在脚本首行加 #!/bin/bash 并确认解释器路径存在。
现象chown 改了所有者但程序还是访问不了。
原因权限同时受属主、属组与其他人三类约束,改属主未必放开组或其他人的限制。
处置chown user:group file 后确认权限位:ls -l 看 rwx 组合,必要时补 chmod。
现象新建的脚本默认没有执行权限,批量部署时全都要加。
原因umask 只影响新建文件的读写位(通常是 644),执行位需显式设置。
处置部署脚本里显式 chmod +x,或用 install -m 755 指定权限一步到位。
排障路径
1查看当前权限并逐位解读
ls -l file十位字符:第一位是文件类型,后九位依次是 u/g/o 的 rwx。
2修复私钥权限
chmod 600 ~/.ssh/id_rsa && chmod 700 ~/.ssh私钥必须 600、目录必须 700,否则 ssh 会直接拒绝使用。
3参照已有文件的权限设置
chmod --reference=template.conf new.conf比手写数字更安全,避免把本该私有的文件改成公开。
4确认默认权限掩码
umask -S符号形式显示更直观;umask 022 对应新建文件 644、目录 755。
5批量设置目录树权限
chmod -R 755 dist/仅对确定统一权限的产物目录使用,私有文件目录切勿 -R 755。
命令示例
为脚本加执行权限并直接运行
chmod +x deploy.sh
./deploy.shchmod +x 等价于给三类用户都加执行位。省略 ugo 时默认是 a。注意 Windows 编辑过的脚本带 CRLF 会报 bad interpreter,用 dos2unix 转一下。
锁定私钥权限(SSH 要求)
chmod 600 ~/.ssh/id_ed25519SSH 拒绝使用组或其他用户可读可写的私钥,报 UNPROTECTED PRIVATE KEY FILE。600 是私钥唯一正确的取值。
参照另一个文件设置权限
chmod --reference=deploy-prod.sh deploy-staging.sh
stat -c "%a %n" deploy-*.sh--reference 避免凭记忆重敲数字,尤其在多台机器上批量对齐权限时。改完用 stat 确认实际生效值。
输出
755 deploy-prod.sh 755 deploy-staging.sh
常见坑与注意事项
- chmod 777 让任何用户都能改文件,一旦有进程被入侵就等于放弃该路径的控制权,应避免。
- 私钥必须 600,权限过宽 SSH 会直接拒绝使用该密钥。
- chmod 数字模式的 0 会清空对应权限,如 chmod 000 会让文件完全不可访问,恢复需 root。
- Windows 编辑的脚本含 CRLF,chmod +x 后运行报 bad interpreter,是换行符问题而非权限问题。
- 改权限不等于改属主,别人仍可能无法写入;需要时配合 chown。
提示
- chmod 数字模式:r=4, w=2, x=1,相加得到权限值(如 rwx = 4+2+1 = 7)。
- 目录的 x 权限表示可以进入(cd),没有 x 权限即使有 r 也进不去。
- SUID 对脚本无效(只对二进制可执行文件),且存在安全风险,谨慎使用。
- `umask 022` 让新建文件默认 644、目录 755;要组内共享文件就设 `umask 002`(得到 664/775)。
- `chmod -R` 会跟着符号链接进入目标目录,批量授权时用 `chmod --reference=已核对过的文件` 复制更稳。
- 私钥必须是 600:`chmod 600 ~/.ssh/id_ed25519 && chmod 700 ~/.ssh`,权限更松 SSH 会直接拒绝加载。
常见问题
755、644、600 分别对应什么权限?
数字模式把权限拆成 r=4、w=2、x=1 三位,分别对应 owner、group、others。755 = rwxr-xr-x,所有者可读写执行,组和其他人可读可执行,常用于可执行脚本和目录;644 = rw-r--r--,只有所有者可写,适合普通文件;600 = rw-------,仅所有者可读写,专用于 SSH 私钥这类敏感文件。
为什么脚本加了执行权限还是跑不了?
常见两个原因:一是文件格式问题,如果脚本是在 Windows 上编辑的,CRLF 换行会让解释器报 bad interpreter,用 dos2unix 或 sed -i 's/ $//' script.sh 转一下;二是解释器路径不存在,看脚本首行 #! 写的路径与系统实际是否对得上。改完先 chmod +x 再运行。
SUID、SGID、Sticky 这三个特殊位什么时候用?
SUID(u+s,如 chmod 4755)让程序执行时以文件所有者的身份运行,典型如 passwd 修改 /etc/shadow;SGID(g+s,如 chmod 2755 目录)让目录内新建的文件自动继承目录的所属组,团队共享目录常用;Sticky(+t,如 /tmp 的 1777)限制只有文件所有者能删除自己的文件,防止互相误删。
chmod 和 chown 有什么区别?
chmod 改的是权限位(谁可以读写执行),chown 改的是属主和属组。想让同事能读某个文件,chmod 644 或 chmod g+r 就够,不必动属主;而把文件交给另一个人管理才需要 chown user file。实际运维里优先用权限解决,chown 改属主的影响面通常更大。
chmod 777 这样的命令能偷懒用吗?
不建议。777 让任何用户都能修改文件,一旦有进程被入侵,它就能替换掉这个文件,等于放弃了对该路径的控制。日常用 755 应付可执行,用 644 应付只读,需要私钥这类敏感内容就用 600。真的遇到权限问题,先确认 SELinux 或 umask 是否才是真正原因。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。