chmod(change mode)是Linux/Unix系统中用于修改文件和目录权限的核心命令。你是否曾在部署脚本或配置Web服务时,被“Permission denied”拦住了去路?理解并掌握chmod,是打通Linux系统管理任督二脉的关键一步。在Linux的安全模型中,每个文件和目录都有三组权限(所有者、所属组、其他用户)和三种基本权限(读、写、执行),chmod正是精确管理这些访问规则的工具。
它既支持直观的符号模式(如u+x),也支持简洁的数字模式(如755),能够满足从快速修改到精细控制的所有场景。正确的权限设置不仅是系统安全的基石,也关乎程序能否正常运行、多用户环境能否高效协作。下面,我们就通过一份详尽的速查表,帮你快速掌握chmod的方方面面。
1. 基本语法
| 命令 |
说明 |
chmod MODE FILE |
chmod通用语法 |
chmod 644 file.txt |
使用数字模式设置权限 |
chmod u+x script.sh |
为所有者添加执行权限 |
chmod g-w file.txt |
移除组的写权限 |
chmod o=r file.txt |
将其他用户权限设置为只读 |
chmod a+x script.sh |
为所有用户(所有者、组、其他)添加执行权限 |
2. 数字权限模式
| 权限 |
说明 |
600 |
所有者读写,组和其他无权限(私密文件) |
644 |
所有者读写,组和其他只读(标准文件) |
640 |
所有者读写,组只读,其他无权限 |
664 |
所有者读写,组读写,其他只读(协作文件) |
700 |
所有者完全控制,组和其他无权限 |
755 |
所有者完全控制,组和其他读和执行(标准目录、可执行文件) |
750 |
所有者完全控制,组读和执行,其他无权限 |
775 |
所有者完全控制,组完全控制,其他读和执行 |
777 |
所有用户完全控制(危险,应避免) |
444 |
所有用户只读 |
555 |
所有用户读和执行 |
3. 符号权限模式
| 命令 |
说明 |
chmod u+x file |
为所有者添加执行权限 |
chmod g-w file |
移除组的写权限 |
chmod o-rwx file |
移除其他用户的所有权限 |
chmod ug+rw file |
为所有者和组添加读写权限 |
chmod a+r file |
为所有用户添加读权限 |
chmod a-x file |
移除所有用户的执行权限 |
chmod u=rw,go=r file |
所有者读写,组和其他只读(等价于644) |
chmod u=rwx,go=rx dir/ |
所有者完全控制,组和其他读和执行(等价于755) |
chmod go= file |
移除组和/or的所有权限 |
符号模式说明:
- 用户标识:
u(所有者)、g(组)、o(其他)、a(所有)
- 操作符:
+(添加)、-(移除)、=(精确设置)
- 权限:
r(读)、w(写)、x(执行)
4. 文件和目录的典型权限
| 命令 |
说明 |
chmod 644 file.txt |
标准文件权限(所有者读写,其他人只读) |
chmod 755 script.sh |
可执行脚本权限 |
chmod 755 directory/ |
标准目录权限(可进入、列出内容) |
chmod u=rw,go=r file.txt |
644的符号模式 |
chmod u=rwx,go=rx directory/ |
755的符号模式 |
chmod +x script.sh |
快速使脚本可执行(保留其他权限) |
chmod -x file.txt |
移除所有用户的执行权限 |
5. 递归更改权限
| 命令 |
说明 |
chmod -R 755 project/ |
递归设置目录及所有内容为755 |
chmod -R u+rwX project/ |
递归添加读写和智能执行权限 |
find project -type f -exec chmod 644 {} + |
只将文件设置为644 |
find project -type d -exec chmod 755 {} + |
只将目录设置为755 |
chmod -R g-w shared/ |
递归移除组的写权限 |
chmod -R a+r public/ |
递归添加所有用户的读权限 |
智能执行(X)说明:大写的 X 表示仅当目标是目录或已有执行权限时才添加执行权限,对普通文件不会意外添加执行权限。这对于批量处理Shell脚本等运维任务非常安全。
6. 特殊权限位
| 命令 |
说明 |
chmod 4755 /usr/local/bin/tool |
设置SUID(4),以文件所有者身份执行 |
chmod 2755 /srv/shared |
设置SGID(2),新文件继承组 |
chmod 1777 /tmp/mytmp |
设置粘滞位(1),仅所有者可删除 |
chmod u+s file |
符号方式添加SUID |
chmod g+s directory |
符号方式添加SGID |
chmod +t directory |
符号方式添加粘滞位 |
chmod -s file |
移除SUID/SGID |
特殊权限说明:
- SUID (4):执行时以文件所有者身份运行(如
/usr/bin/passwd)
- SGID (2):目录中新建文件继承目录的组
- Sticky Bit (1):目录中仅文件所有者可删除(如
/tmp)
7. 安全操作模式
| 命令 |
说明 |
chmod 600 ~/.ssh/id_ed25519 |
设置SSH私钥安全权限 |
chmod 700 ~/.ssh |
设置SSH目录安全权限 |
chmod 644 ~/.ssh/id_ed25519.pub |
公钥权限(可公开) |
chmod 750 /var/www/app |
限制Web根目录访问 |
chmod 755 script.sh |
脚本权限(比777安全) |
chmod 600 .pgpass |
数据库密码文件权限 |
chmod 400 backup.key |
备份密钥只读权限 |
8. 实用组合模式
| 命令 |
说明 |
chmod -R 755 public_html/ && find public_html -type f -exec chmod 644 {} + |
目录755,文件644(标准网站配置) |
chmod 600 config.yml && chmod +x deploy.sh |
配置文件安全,部署脚本可执行 |
chmod -R u+rwX,go+rX project/ |
保留所有者完全控制,其他人可读和智能执行 |
chmod 2770 /srv/teamproject && chmod g+s /srv/teamproject |
协作目录设置 |
chmod -R --silent 755 /path 2>/dev/null |
静默执行,忽略错误 |
9. 常用选项速查
| 选项 |
完整名称 |
说明 |
-R |
--recursive |
递归更改目录及其内容 |
-v |
--verbose |
显示详细处理信息 |
-c |
--changes |
仅在发生更改时显示信息 |
-f |
--silent, --quiet |
静默模式,抑制错误信息 |
--reference=RFILE |
- |
使用参考文件的权限 |
10. 权限验证命令
| 命令 |
说明 |
ls -l file.txt |
查看文件详细权限 |
ls -ld directory/ |
查看目录权限 |
stat file.txt |
显示文件的完整状态信息 |
namei -l /path/to/file |
查看路径中所有目录的权限 |
getfacl file.txt |
查看文件ACL权限(扩展权限) |
11. 故障排查
| 问题 |
解决方法 |
| Operation not permitted |
检查文件所有权:ls -l;使用sudo或以文件所有者身份执行 |
| Permission still denied after chmod |
父目录可能缺少执行权限(需要x才能进入);检查ACL:getfacl |
| Cannot chmod symlink |
chmod默认作用于符号链接的目标文件,而非链接本身 |
| 递归模式破坏了应用文件 |
使用find分别处理文件和目录,而非单一的-R |
| 更改在挂载分区上无效 |
检查挂载选项(如noexec、nosuid)和文件系统类型 |
| umask导致新文件权限不符预期 |
检查umask设置:umask;在脚本中设置适当umask |
| 粘滞位没有生效 |
确认目录是否有t标志:ls -ld /tmp |
温馨提示:权限设置务必遵循最小权限原则——只授予必要的权限。常用模式可以牢记于心:文件644/640,目录755/750,私密文件600,可执行脚本755。使用-R递归选项时要格外谨慎,避免破坏系统文件。对于生产环境,强烈建议先在测试环境验证更改,或者使用find命令分别对文件和目录进行精确的权限控制,这样更能保障Linux系统的稳定与安全。
|