ls -l 开头那串 -rw-r–r– 是每个 Linux 用户最早要啃的一块骨头。文件权限决定了谁能读、谁能写、谁能执行,而 chmod、chown、umask 就是你调整这套规则的三件套。这一篇把 rwx 的含义、数字与符号两种改法、属主属组的归属、以及新建文件默认权限的来源一次讲清。
一、先看懂 ls -l 里那串权限位
随便 ls -l 一个文件,输出长这样:
-rw-r–r– 1 zhangsan developers 1280 Sep 16 10:20 notes.txt
drwxr-xr-x 2 zhangsan developers 4096 Sep 16 10:21 docs
最前面那 10 个字符拆开看:第一位是文件类型,后面九位分三组,分别对应属主(user)、属组(group)、其他人(others)。
类型 属主 属组 其他人
– rw- r– r–
| 第 1 位 | 文件类型:- 普通文件,d 目录,l 软链接,c/b 设备文件 |
| 第 2-4 位 | 属主权限:r w x |
| 第 5-7 位 | 属组权限 |
| 第 8-10 位 | 其他人权限(既不是属主,也不在属组里) |
rwx 对文件和对目录的含义不一样,这是新手最容易混的地方:
| r | 能读文件内容(cat、more) | 能列出目录里的文件名(ls) |
| w | 能修改文件内容 | 能在目录里新建、删除、改名文件 |
| x | 能把文件当程序执行 | 能进入目录(cd)、能访问目录内文件的元数据 |
重点说一下目录的 w:目录有 w,里面的文件就能被删,不管文件本身属主是谁。这就是为什么 /tmp 要靠 Sticky Bit(下一篇讲)来防止用户互删文件。
二、chmod:改权限
语法格式
chmod [选项] 模式 文件名
模式有两种写法:数字法和符号法。
数字法
r、w、x 分别对应一个数字:r=4,w=2,x=1。把三组各自加起来,就得到一个三位数:
| 7 | rwx | 读 + 写 + 执行 |
| 6 | rw- | 读 + 写 |
| 5 | r-x | 读 + 执行 |
| 4 | r– | 只读 |
| 0 | — | 无任何权限 |
所以 644 = 属主 rw-、属组 r–、其他人 r–,这也是普通文件最常见的默认权限。
chmod 644 notes.txt
chmod 755 script.sh
改完确认:
ls -l notes.txt script.sh
预期输出:
-rw-r–r– 1 zhangsan developers 1280 Sep 16 10:20 notes.txt
-rwxr-xr-x 1 zhangsan developers 128 Sep 16 10:22 script.sh
符号法
数字法是"整组重设",符号法则适合只改某一位,比如"给其他人加执行权限"。
| u / g / o / a | 属主 / 属组 / 其他人 / 所有人(a 是 ugo 的缩写) |
| + / – / = | 增加 / 去掉 / 精确设置 |
| r / w / x | 对应权限 |
chmod u+x script.sh # 属主加执行权限
chmod g-w notes.txt # 属组去掉写权限
chmod o=r notes.txt # 其他人精确设为只读
chmod a+x deploy.sh # 所有人都加执行权限
一条命令里可以用逗号拼多个修改:
chmod u=rwx,g=rx,o= script.sh
末尾 o= 后面空着,表示其他人没有任何权限。
常用选项
| -R | 递归修改目录下所有内容 |
| –reference=参考文件 | 直接套用某个文件的权限,不自己算数字 |
chmod –reference=/etc/hostname notes.txt
这条在批量对齐权限时很好用,不用心算 644 还是 640。
⚠️ 常见错误
find /var/www -type f -exec chmod 644 {} \\;
三、chown / chgrp:改属主和属组
权限决定了"谁能怎么访问",属主属组决定了"文件归谁"。两者配合才完整。
chown 语法
chown [选项] 属主[:属组] 文件
| chown zhangsan file | 只改属主为 zhangsan |
| chown zhangsan:developers file | 同时改属主和属组 |
| chown :developers file | 只改属组(等价 chgrp) |
| chown zhangsan: file | 改属主为 zhangsan,同时把属组改成 zhangsan 的登录组 |
把 /var/www 的运行权限交给 Nginx:
sudo chown -R www-data:www-data /var/www
ls -ld /var/www
预期输出:
drwxr-xr-x 4 www-data www-data 4096 Sep 16 10:30 /var/www
-R 同样是递归。改属主通常需要 root 或 sudo,普通用户只能改自己拥有的文件的属组,而且能改的目标组还得是自己所在的组。
chgrp
chgrp 组名 文件 是只改组的简写,本质和 chown :组名 一样。知道就行,实际用 chown :组 的场合更多。
⚠️ 注意事项
- 用冒号还是点?历史上 chown user.group 用点分隔,现在统一推荐冒号 user:group,兼容性更好。
- 软链接本身的属主基本没意义,chown 默认会跟着链接改到指向的原文件;要改软链接自己用 -h。
四、umask:新建文件默认权限从哪来
每次你 touch new.txt、mkdir docs,新文件/新目录的权限是怎么定的?答案是 umask。
原理
系统对新建文件和目录有一套"基线权限":
- 文件基线:666(rw-rw-rw-)
- 目录基线:777(rwxrwxrwx)
umask 是一个掩码,从基线里减掉对应位。注意是"减",不是直接取反:
最终权限 = 基线权限 – umask
看一下当前 shell 的 umask:
umask
预期输出(常见值):
0022
第一位 0 是特殊权限位(下一篇讲),后三位才是掩码。套进去算:
- 文件:666 – 022 = 644(rw-r–r–)
- 目录:777 – 022 = 755(rwxr-xr-x)
这正好对应你平时 touch 和 mkdir 看到的默认值。
查看和修改
umask # 看数字形式
umask -S # 看符号形式
预期输出:
u=rwx,g=rx,o=rx
临时改一下(只对当前 shell 生效):
umask 0027
touch demo.txt && ls -l demo.txt
预期输出:
-rw-r—– 1 zhangsan developers 0 Sep 16 10:40 demo.txt
027 的效果是:同组人可读不可写,其他人完全没权限。团队协作目录常用 002 或 007,让同组人新建的文件互相能改。
永久生效
改 ~/.bashrc(个人)或 /etc/profile、/etc/profile.d/*.sh(全局):
# 追加到 ~/.bashrc
umask 0027
Ubuntu/Debian 还有个 /etc/login.defs 里的 UMASK 项控制登录时的默认值,和 shell 配置配合看。
⚠️ 常见误区
- 文件没有执行位是设计如此:系统从不给新建的普通文件 x 位,防止误创建一堆可执行文件。脚本写完必须自己 chmod +x。
- umask 000 很危险:新建文件直接 666,同组任何人都能改你的家目录文件,别图省事设成这个。
五、知识扩展:权限信息藏在 inode 里
ls -l 看到的 rwx,本质是从文件 inode 里的 mode 字段读出来的。想看更底层的数字表示,用 stat:
stat notes.txt
预期输出(节选):
File: notes.txt
Size: 1280 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049dInode: 131085 Links: 1
Access: (0644/-rw-r–r–) Uid: ( 1001/zhangsan) Gid: ( 1001/developers)
Access: (0644/-rw-r–r–) 同时给出了八进制和符号形式,调试权限问题时 stat 比 ls -l 信息更全。
另一个高频困惑:root 是不是无视一切权限? 基本是。root 读写几乎所有文件、进几乎所有目录都不被 rwx 拦,但有几个例外:挂载了 noexec 的分区、内核模块保护的文件、以及某些被 immutable 标签(chattr +i)锁住的文件。日常排障时记住"root 不受 rwx 限制"就够用了。
还有个容易被忽略的点:权限只和 UID/GID 有关,和用户名无关。文件里存的是数字 UID,ls 只是临时把数字翻译成名字。如果一台机器上的用户迁到 NFS/LDAP,或者删掉重建过用户,经常会看到 ls 显示成一串数字(比如 -rw-r–r– 1 1001 1001),那就是这个 UID 在本地 /etc/passwd 里找不到名字了。






