chmod 命令速查表 - Linux 文件权限管理常用命令大全

权限出问题的现场往往只有一句 "Permission denied",成因却可能是位序算错、目录漏了 x、属组没对齐,或 umask 悄悄改掉了新建文件的默认值。读懂 owner/group/others 三元组加上 SUID/SGID/Sticky 三个特殊位之后,ls -l 那九位字符就不再是符咒,而是能直接口算的表达式。这张表用数字模式与符号模式左右对照同一组权限,每种写法都标出落在哪一位;特殊权限单列,因为它们改的不是「谁能读写」而是「权限怎么被赋予」——SUID 让程序以文件属主身份运行,SGID 让目录里新建的文件继承属组,Sticky 让共享目录里只有属主能删自己的文件。什么时候该翻它:脚本加了 x 仍然跑不起来、日志目录写不进去、SSH 拒绝加载私钥。跟 setfacl 相比它表达力有限,但可移植性最好,也是部署脚本唯一认得的形式

系统与运维·共 37 条命令·最后更新 2026-07-21
chmod权限linux

典型使用场景

面向管理 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)
读权限,数字 4
w (write)
写权限,数字 2
x (execute)
执行权限,数字 1
- (no permission)
无权限,数字 0
u g o
用户(owner)/ 组(group)/ 其他(others)
a
所有(all),等价于 ugo

数字模式 Numeric Mode 6

chmod 755 file
rwxr-xr-x(所有者全权限,其他人读执行)
chmod 644 file
rw-r--r--(所有者读写,其他人只读)
chmod 700 file
rwx------(仅所有者有全权限)
chmod 600 file
rw-------(仅所有者读写,常用于私钥)
chmod 777 file
rwxrwxrwx(所有人全权限,危险!)
chmod 750 dir
rwxr-x---(所有者全权限,组读执行)

符号模式 Symbolic Mode 6

chmod u+x file
给所有者加执行权限
chmod go-w file
给组和其他人去写权限
chmod a+r file
给所有人加读权限
chmod u=rw,go=r file
设置所有者读写,其他人只读
chmod +x script.sh
给所有人加执行权限(省略 ugo 默认 a)
chmod -R 755 dir/
递归修改目录权限

特殊权限 Special Permissions 6

chmod u+s file (4755)
SUID:执行时以所有者身份运行
chmod g+s dir (2755)
SGID:目录内新建文件继承组
chmod +t dir (1777)
Sticky:仅所有者可删除文件(如 /tmp)
chmod 4755 file
数字模式设置 SUID
chmod 2755 dir
数字模式设置 SGID
chmod 1777 dir
数字模式设置 Sticky

常见权限组合 Common Patterns 6

644
普通文件(所有者读写,其他人只读)
755
可执行文件和目录
600
私钥文件(SSH、SSL)
640
配置文件(所有者读写,组只读)
700
私有目录(仅所有者访问)
750
共享目录(所有者全权限,组读执行)

参数矩阵

参数作用示例
r / w / x读 4 / 写 2 / 执行 1rwx = 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. 1查看当前权限并逐位解读

    ls -l file

    十位字符:第一位是文件类型,后九位依次是 u/g/o 的 rwx。

  2. 2修复私钥权限

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

    私钥必须 600、目录必须 700,否则 ssh 会直接拒绝使用。

  3. 3参照已有文件的权限设置

    chmod --reference=template.conf new.conf

    比手写数字更安全,避免把本该私有的文件改成公开。

  4. 4确认默认权限掩码

    umask -S

    符号形式显示更直观;umask 022 对应新建文件 644、目录 755。

  5. 5批量设置目录树权限

    chmod -R 755 dist/

    仅对确定统一权限的产物目录使用,私有文件目录切勿 -R 755。

命令示例

为脚本加执行权限并直接运行

chmod +x deploy.sh ./deploy.sh

chmod +x 等价于给三类用户都加执行位。省略 ugo 时默认是 a。注意 Windows 编辑过的脚本带 CRLF 会报 bad interpreter,用 dos2unix 转一下。

锁定私钥权限(SSH 要求)

chmod 600 ~/.ssh/id_ed25519

SSH 拒绝使用组或其他用户可读可写的私钥,报 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们