Linux文件权限命令之rwx、chmod、chown、umask用法与实战
作者:程序员Benothing
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。
常见错误
-R把目录和文件一起改成 777:chmod -R 777 /var/www会让目录里的普通文件也带 x 位,而且人人可写,等于把安全门拆了。目录一般 755,文件一般 644,分开用find处理:
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
- 以为 777 能解决一切:改成 777 后服务还是起不来,多半不是权限问题,而是属主不对、SELinux/AppArmor 在拦。别一上来就 777,先查
ls -l看属主。 - 脚本忘了 +x:写好的
.sh双击或./script.sh报 Permission denied,十有八九是没加执行位。bash script.sh能跑是因为它把文件当参数传给 bash,不需要 x 位。
三、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/2049d Inode: 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 里找不到名字了。
以上就是Linux文件权限命令之rwx、chmod、chown、umask用法与实战的详细内容,更多关于Linux文件权限命令rwx、chmod、chown、umask的资料请关注脚本之家其它相关文章!
