Linux 权限 755、644 到底什么意思?chmod 和 chown 用法详解
chmod 755、chown root:root,这些命令天天用,但权限背后的原理你真的清楚吗?本文从二进制位到实战场景,彻底讲透 Linux 权限系统。
一、问题场景
# 部署应用后,页面报 403 Forbidden$ ls -l /var/www/html/index.html-rw------- 1 root root 1234 Jun 15 10:00 index.html# 或者$ ls -ld /data/appdrwxr-xr-x 3 root root 4096 Jun 15 10:00 /data/app
权限配错,服务起不来、文件读不了、脚本执行不了。理解权限位是运维的基本功。
二、权限位拆解:rwx 到底是什么
1. 10 位权限字符串
-rwxr-xr-x 1 root root 1234 Jun 15 10:00 script.sh│└┬┘└┬┘└┬┘│ │ │ ││ │ │ └── 其他用户权限 (o)│ │ └───── 所属组权限 (g)│ └──────── 文件所有者权限 (u)└────────── 文件类型 (- 普通文件, d 目录, l 链接)
2. rwx 的含义
3. 数字权限计算
常见组合:
三、chmod 命令详解
1. 数字模式
# 设置文件权限chmod 755 script.sh # 所有者读写执行,其他人读执行chmod 644 config.ini # 所有者读写,其他人只读chmod 600 id_rsa # 私钥文件,仅所有者可读# 递归设置目录chmod -R 755 /data/app # -R 递归,注意:会改所有子文件!
2. 符号模式(更精细)
chmod u+x script.sh # 给所有者添加执行权限chmod g-w file.txt # 去掉组的写权限chmod o=r file.txt # 设置其他人只有读权限chmod a+x script.sh # 给所有人添加执行权限(u+g+o)# 组合用法chmod u=rwx,g=rx,o=rx dir # 等同于 chmod 755 dir
3. 特殊权限位
# 设置 SUID(如 passwd 命令)chmod u+s /usr/bin/somebin # 或 chmod 4755# 设置 SGID(共享目录常用)chmod g+s /data/shared # 或 chmod 2755# 设置 Sticky(如 /tmp 目录)chmod +t /data/tmp # 或 chmod 1777# 查看ls -l /usr/bin/passwd-rwsr-xr-x 1 root root 68208 Mar 23 2022 /usr/bin/passwd ↑ s 表示 SUID
四、chown 命令详解
1. 基本用法
# 修改所有者chown alice file.txt# 修改所有者和所属组chown alice:developers file.txt# 只修改所属组chown :developers file.txt# 或chgrp developers file.txt# 递归修改chown -R alice:alice /data/app
2. 常用选项
| |
|---|
-R | |
--reference=RFILE | |
--from=CURRENT | |
# 参考其他文件权限chown --reference=/etc/passwd /data/newfile# 只把 root 拥有的文件改为 alicechown --from=root alice /data/*
五、实战场景
场景1:Web 服务目录权限
# Nginx/Apache 运行用户通常是 www-data 或 nginx# 网站根目录需要:# - 所有者:部署用户(可读写)# - 组:web服务用户(可读)# - 其他人:只读# 创建目录结构mkdir -p /var/www/myappchown -R deploy:www-data /var/www/myappchmod -R 755 /var/www/myapp # 目录chmod -R 644 /var/www/myapp/*.html # 静态文件# 上传目录需要 web 用户可写chmod 775 /var/www/myapp/uploads
场景2:SSH 私钥权限
# 私钥权限必须严格,否则 SSH 拒绝使用chmod 600 ~/.ssh/id_rsachmod 644 ~/.ssh/id_rsa.pubchmod 600 ~/.ssh/authorized_keyschmod 700 ~/.ssh
场景3:日志目录权限
# 应用日志目录:应用用户可写,其他用户只读mkdir /var/log/myappchown appuser:appuser /var/log/myappchmod 755 /var/log/myapp# 日志文件:应用用户可写,其他人可读chmod 644 /var/log/myapp/*.log
场景4:共享协作目录(SGID 应用)
# 团队共享目录,新建文件自动继承组mkdir /data/teamchown root:developers /data/teamchmod 2775 /data/team # 2 = SGID,775 = rwxrwxr-x# 效果:alice 在目录下新建的文件,组自动是 developers# 而不是 alice 的主组
六、umask:默认权限的幕后黑手
1. umask 是什么
新建文件/目录的默认权限 = 最大权限 - umask
2. 查看和设置
# 查看当前 umaskumask0022 # 第一位是特殊权限,后三位是 ugo# 临时设置(当前会话)umask 027 # 新建文件 640,目录 750# 永久设置(写入配置文件)echo "umask 027" >> ~/.bashrc
3. 常见 umask 值
七、ACL:超越传统权限的精细控制
当传统 ugo 权限不够用时,用 ACL(Access Control List)。
# 给特定用户添加权限setfacl -m u:alice:rw file.txt# 给特定组添加权限setfacl -m g:developers:rwx /data/project# 查看 ACLgetfacl /data/project# 递归设置setfacl -R -m u:alice:rwX /data/project# 删除 ACLsetfacl -x u:alice file.txt# 清空所有 ACLsetfacl -b file.txt
启用 ACL:
# 检查文件系统是否支持mount | grep acl# 临时挂载mount -o remount,acl /data# 永久配置 /etc/fstab/dev/sda1 /data ext4 defaults,acl 0 0
八、排查权限问题的思路
# 1. 查看文件权限ls -l file.txtls -ld /data/dir# 2. 查看当前用户身份whoamiidgroups# 3. 检查父目录权限(进入目录需要 x 权限)ls -ld $(dirname /data/app/config.ini)# 4. 检查 SELinux(可能阻止访问)getenforcels -Z file.txt# 5. 用 namei 追踪路径权限namei -l /data/app/config.ini
九、总结 checklist
□ 文件权限:r=4, w=2, x=1,三组叠加□ 目录需要 x 权限才能 cd 进入□ 私钥、密码文件必须 600□ 可执行脚本需要 x 权限□ 共享目录考虑 SGID(2)让新建文件继承组□ 公共可写目录加 Sticky(1)防止误删□ 用 umask 控制新建文件默认权限□ ACL 用于超越 ugo 的精细控制□ 修改权限前先用 ls -l 确认当前状态