很多人刚接触Linux权限时,只记住了chmod 777一把梭。等到被人删了文件或者配置被篡改,才发现权限模型里的坑一点也不少。这篇文章把所有者、用户组、rwx权限位、umask掩码、粘滞位串起来,讲清楚Linux这套简洁但精确的访问控制逻辑。
目录
[修改权限:chmod 的两种写法](#修改权限:chmod 的两种写法)
[改变所有者和组:chown / chgrp](#改变所有者和组:chown / chgrp)
谁在访问文件?
Linux把访问者分成三类:
-
所有者 (u) :文件的创建者或通过
chown指定的人。 -
所属组 (g):文件所属的用户组,组内成员共享该组权限。
-
其他人 (o):不和以上两者沾边的所有用户。
这三类人的权限是独立判断的。匹配顺序是先看你是不是所有者,再看是不是在组里,最后才是其他人。一旦匹配上,就直接应用对应权限,不会向上或向下叠加。
超级用户root不受这套限制。它的命令提示符是#,普通用户是$。su可以切用户,从root切普通用户不需要密码,反过来则需要验证。
文件类型与权限位
每个文件有类型和权限属性。ls -l第一列共10个字符:
text
-rwxr-xr--
-
第1位:文件类型。
-普通文件,d目录,l软链接,b块设备,c字符设备,p管道,s套接字。 -
后9位:每三位一组,对应所有者、所属组、其他人的读(r)、写(w)、执行(x) 权限,没有则为
-。
r/w/x对文件和目录的含义截然不同:
| 权限 | 对文件 | 对目录 |
|---|---|---|
| r | 读取文件内容 | 列出目录下的文件名 |
| w | 修改文件内容 | 在目录中创建/删除文件 |
| x | 作为程序执行 | 进入目录(cd) |
有一类经典误解:有目录的读权限就能进去?错,能列出内容但不能cd进去,必须有x权限。反过来,有x但没有r,可以进目录却看不到文件名,但只要知道文件名,仍能读写该文件。目录的x权限才是真正的"通行证"。
修改权限:chmod 的两种写法
chmod用来改权限,只有文件所有者和root可以操作。两种表达方式:
符号模式
bash
chmod u+x file # 所有者加执行
chmod g-w file # 组去写
chmod o=r file # 其他人只读
chmod a+x dir # 所有人加执行
chmod -R u+w dir # 递归修改目录及其下所有文件
八进制模式
每种权限对应一个数字:r=4,w=2,x=1。三组加起来就是一个三位数。
bash
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
通常写脚本配权限直接用数字更干脆。chmod 777永远是最后的选择,优先考虑最小权限原则。
改变所有者和组:chown / chgrp
bash
chown user1 file
chown user1:group1 file
chown -R user1 dir/
chgrp group1 file
普通用户不能把自己的文件随便送给别人(防止绕过配额限制等),只有root可以任意改所有者。
默认权限是怎么来的:umask
新建文件和目录的默认权限并不是0666和0777,而是被umask遮掉了一部分。
计算公式:默认权限 & ~umask。把umask取反后再与默认权限按位与,结果是最终权限。
举例:umask=0022,
-
文件默认666 → 666 & ~022 = 666 & 755 = 644 (rw-r--r--)
-
目录默认777 → 777 & ~022 = 755 (rwxr-xr-x)
root默认umask0022,普通用户通常0002。可以用umask查看当前值,umask 027临时修改。
目录权限与粘滞位:为什么我的文件会被别人删?
文件能否被删除不取决于文件本身的写权限,而取决于所在目录的写权限。只要某个用户对目录有w权限,就可以删掉目录下的任意文件,即便这个文件属于root且是444只读。
这种设计对/tmp这类共享目录就造成了安全隐患。张三的文件凭什么被李四删?于是引入粘滞位(sticky bit)。
bash
chmod +t /tmp
ls -ld /tmp # 看到权限末尾的t
目录设置粘滞位后,目录下的文件只有三种人能删:超级管理员、目录所有者、文件所有者。其他人即使有目录写权限也无法删除别人的文件。
/tmp默认就有这个位,你可以自己去验证。很多多人协作场景下,公共目录加粘滞位是基本操作。
再谈sudo:可控的权限提升
直接给root密码是全有或全无的粗暴做法。sudo允许系统管理员在/etc/sudoers里细化规则:哪个用户可以在哪些主机上以谁的身份执行哪些命令。配置完,普通用户通过sodu -u 目标用户 命令来临时提权,操作会被记录。
生产环境里,只给必要的sudo权限,不随便开全部命令------这是运维纪律,不是技术问题。
总结几句
Linux权限模型的核心就两点:三类用户 和三种权限。前者解决"谁能访问",后者解决"能做什么"。目录权限的逻辑稍显反直觉,但只要记住"对目录的w控制的是目录内文件的生杀大权",整个模型就通了。粘滞位是在这个模型上打的一个精巧补丁,成本极低,但解决了真实的多用户共享场景痛点。
下一次配置线上目录或者排查权限问题时,先别急着chmod 777,停下来想想:所有者是谁?组对哪些人可见?操作本质是需要文件的rwx还是目录的rwx? 答案往往就在这几个问题里。