文章目录
前言
本篇文章主要针对Linux文件系统的权限进行了讲解,通过各种命令对文件的权限进行设置和修改,除了普通权限读(r
)、写(w
)、执行(x
),还介绍了特殊权限、隐藏权限、ACL访问控制列表等,使用的命令有chmod、chown、chagrp、chattr、setfacl、umask
,通过这些命令的学习,让大家可以精确的修改和设置文件的权限,从而使文件的使用变得更加严谨。
1、了解文件和目录的权限
1.1 查看文件和目录的权限
Linux中每个文件都有属于自己的权限,权限分为三种:
读(r)、写(w)、执行(x)
1、查看权限:
-
查看目录下所有文件和目录的权限
ls -l 文件/目录 # 会查看指定目录下所有的文件和目录的详细信息
-
只查看指定目录或文件的权限
ls -ld 目录/文件
2、分析文件或目录返回的权限信息
我们通过 ls
命令查看文件文件和目录的详细信息后,会返回8个字段,如下:
- rw-r--r--. 1 root root 2292 4月 29 21:29 /etc/passwd
文件类型 文件权限 连接数 所属人 所属组 大小 修改时间 文件/目录名
说明:
从上面可以看到 /etc/passwd
这个文件的权限是: rw-r--r--
,这里包含着三个角色的权限,每个角色占三个字符,如下:
rw-
:文件所属人,权限为可读可写r--
:文件所属组用户,权限为可读r--
:其它用户,权限为可读
文件权限分配示意图:
1.2 文件的分类
1、我们通过命令 ls
查看文件信息时,最前面的一个字段表示的是文件的类型,如下:
2、文件常见类型
-
:普通文件d
:目录l
:链接文件b
:块设备c
:字符设备p
和s
:表示特殊文件
3、权限对文件和目录的影响
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r (读) | 可以读取文件的内容 | 可以列出目录的内容 (文件名) |
w (写) | 可以更改文件的内容 | 可以创建或删除目录中的任一文件 |
x (执行) | 可以作为命令执行文件 | 可以进入目录(还需要r权限才能读目录内容) |
注意:
- 超级管理员root无视任何进入目录的权限,可随意进入
- 如果某个用户没有目录的执行权,默认也会丧失目录的写入权限
- 超级管理员无视除执行权限外其它文件的操作权限,可随意读写其它用户的文件
2、文件权限管理
2.1 修改文件或目录的权限(chmod)
chmod
是 Linux/Unix 中用于修改文件或目录权限的命令,其名称源自 change mode。权限分为 读(r
)、写(w
) 和 执行(x
),分别对应数字4、2、1
。
1、基本语法
chmod [选项] 权限模式 文件/目录
2、权限模式表示方法
- 数字模式(常用)
-
权限用三位八进制数表示,分别对应 所有者(Owner)、所属组(Group) 和 其他用户(Others)。
-
权限数字计算:r(4) + w(2) + x(1)。
数字 权限 说明 7 rwx 读 + 写 + 执行 6 rw- 读 + 写 5 r-x 读 + 执行 4 r– 只读 0 — 无权限 -
示例:
chmod 755 file.txt # 所有者:rwx,组和其他:r-x chmod 644 file.txt # 所有者:rw-,组和其他:r--
-
- 符号模式
- 通过
u
(所有者)、g
(组)、o
(其他)、a
(所有用户)和+ - =
操作符修改权限。 - 示例:
chmod u+x script.sh # 给所有者添加执行权限 chmod go-w file.txt # 移除组和其他用户的写权限 chmod a=rw file.txt # 所有用户设置为读写权限
- 通过
3、常用选项
选项 | 作用 |
---|---|
-R | 递归修改目录及其内容权限 |
-v | 显示权限修改的详细信息 |
-c | 仅显示发生变化的文件信息 |
递归修改示例:
chmod -R 755 /path/to/dir # 递归修改目录及子文件权限
4、特殊权限
-
SUID
-
SUID
是一种对二进制程序(命令)
进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限。在触发拥有该权限的二进制程序时,一瞬间获得该程序拥有人的权限,进而可以维持该权限执行在与该二进制程序所关联的文件或目录上。 -
设置方法
数字模式:
chmod 4777 /usr/bin/rm # 第一个数字 4 代表特殊权限 SUID ,后面三个数字则分别为所有者、所属组用户、其它用户的权限
符号模式:
chmod u+s /usr/bin/rm # 给 /usr/bin/rm 命令加上 SUID 权限 chmod u-s /usr/bin/rm # 去除 /usr/bin/rm 命令的 SUID 权限
-
注意事项:
给某条命令设置了SUID
权限后,会让没有该命令权限的用户临时拥有它的控制权,从而执行命令,因此;SUID
谨慎设置在vim、cat、rm
等命令上,防止没有该命令权限的用户执行了错误操作
-
-
SGID
-
作用:
- 当对
二进制程序
进行设置时,能够让执行者临时获得文件所属组
的权限 - 当对
目录
进行设置时,则是让目录内创建的文件
自动继承该目录原有的用户组
(一般用来做共享目录)
- 当对
-
设置方法
数字模式:
chmod 2777 /usr/bin/rm # 第一个数字 2 代表特殊权限 SGID ,后面三个数字则分别为所有者、所属组用户、其它用户的权限
符号模式:
chmod g+s /usr/bin/rm # 给 /usr/bin/rm 命令加上 SGID 权限 chmod g-s /home # 去除 /home 目录的 SGID 权限
-
-
SBIT(粘滞位)
-
如果目录设置了
SBIT
权限,则可确保用户智能删除拥有人是自已的文件,不可以删除其他人的文件。(一般用来做共享目录) -
设置方法
数字模式:
chmod 1777 /home # 第一个数字 1 代表特殊权限 SBIT ,后面三个数字则分别为所有者、所属组用户、其它用户的权限
符号模式:
chmod o+t /home # 给 /home 目录加上 SBIT 权限 chmod o-t /home # 去除 /home 目录的 SBIT 权限
-
4. 总结
数字 | 符号 | 作用 |
---|---|---|
4 | s | SUID(仅对文件) |
2 | s | SGID(对文件/目录) |
1 | t | SBIT(对目录) |
SUID
是用来文件所有者
赋权的,SGID
是用来给文件所有组
赋权的,SBIT
是给其他用户
赋权的;在chmod
命令中 分别对应:u、g、o
- 以上三种特殊权限都只能修改,
u、g、o
三种用户的 执行(x
) 权限,若赋予权限时,参数都为大写字母
;那么就代表该文件拥有者没有 执行(x
) 权限;如:chmod u+S,g+S,o+T huawei01 ,该方法用于取消文件的特殊权限 - 修改权限可以用 数字表示;如:chmod +7777 file.txt ;其中第一个
7
代表文件的特殊权限,SUID(4)、SGID(2)、SBIT(1)
;7
就相当与该文件同时拥有三种特殊权限
,后面三个数字就分别代表 用户、用户组、其它组用户
5、注意事项
-
修改权限需要 所有者 或
root
权限。 -
目录需有 执行权限(
x
) 才能进入。 -
敏感文件(如
/etc/passwd
)权限需谨慎设置。
通过灵活组合数字和符号模式,可以精确控制文件/目录的访问权限。
2.2 更改文件或目录的所有者和所有组(chown)
chown
是 Linux 中用于更改文件或目录的所有者(owner)和所属组(group)的命令,其名称来源于 change owner。
1、基本语法
chown [选项] [新所有者][:新所属组] 文件或目录
常用选项:
选项 | 作用 |
---|---|
-R | 递归处理目录及其子内容 |
-v | 显示详细操作信息(verbose) |
-c | 类似 -v,但仅显示更改过的文件 |
--reference=文件 | 参考指定文件的所有者和组 |
2、常用方法使用示例
-
更改文件的所有者
chown username filename
将
filename
的所有者改为username
(需要 sudo 权限,除非你是 root)。 -
更改文件的所有者和所属组
chown username:groupname filename
同时将
filename
的所有者改为username
,所属组改为groupname
。 -
仅更改文件的所属组
chown :groupname filename
仅修改所属组(注意前面的冒号 :)。
-
递归更改目录及其内容
chown -R username:groupname dirname
-R
表示递归操作,适用于目录及其子目录和文件。 -
从参考文件复制所有者配置
chown --reference=参考文件 目标文件
将
目标文件
的所有者和组设置为与参考文件
相同。
3、注意事项
-
权限要求:普通用户只能更改自己拥有的文件,若需修改其他用户的文件,需用
sudo
。 -
组名可选:如果省略
:groupname
,则只修改所有者。 -
符号链接:默认不跟随符号链接(需用
-h
修改链接本身,或用-L
跟随链接)。
4、示例场景
-
将 /var/www 的所有权交给用户 www-data 和组 www-data:
chown -R www-data:www-data /var/www
-
仅修改文件 test.txt 的组为 developers:
chown :developers test.txt
通过 man chown
可以查看完整手册。使用时注意权限问题,避免误操作系统关键文件!
2.3 只更改文件或目录的所属组(chgrp)
chgrp
是 Linux 中用于更改文件或目录的所属组的命令,其名称来源于 change group。
1、基本语法
chgrp [选项] 新组名 文件或目录
常用选项:
选项 | 描述 |
---|---|
-R | 递归更改目录及其子内容的所有组(用于目录) |
-v | 显示详细操作信息(verbose) |
-c | 仅显示更改过的文件信息 |
-f | 忽略错误信息(静默模式) |
--reference=参考文件 | 将目标文件的组设置为与参考文件相同 |
2、常用方法使用示例
-
更改文件的所属组
chgrp developers file.txt
将
file.txt
的组更改为developers
(需确保组名已存在)。 -
递归更改目录及其内容的所属组
chgrp -R developers /path/to/directory
将目录及其子文件、子目录的组全部改为
developers
。 -
显示操作详情
chgrp -v developers file.txt
输出类似:changed group of ‘file.txt’ from oldgroup to developers。
-
使用参考文件同步组
chgrp --reference=source_file.txt target_file.txt
将
target_file.txt
的组设置为与source_file.txt
相同。 -
仅显示实际更改的文件
chgrp -c developers *.txt
仅当文件组确实被修改时才会显示信息。
3、注意事项
-
组名必须存在
- 使用前需确认目标组已在
/etc/group
中定义,否则会报错。
- 使用前需确认目标组已在
-
权限要求
-
普通用户只能更改自己拥有的文件的组,且目标组必须是该用户的附加组之一。
-
root
用户可任意更改。
-
-
符号链接
- 默认情况下,
chgrp
作用于符号链接指向的文件(而非链接本身)。若需修改链接本身的组,使用-h
选项(但需系统支持)。
- 默认情况下,
-
与
chown
的区别chown
可以同时修改文件的所有者(user)和组(如 chown user:group file),而chgrp
仅修改组。
通过以上命令,你可以灵活管理文件或目录的组权限。如需进一步帮助,可通过 man chgrp
查看手册。
2.4 修改文件或目录的扩展属性(chattr)
chattr
是 Linux 中用于修改文件或目录的扩展属性(extended attributes)的命令,这些属性可以控制文件系统的行为,例如防止文件被删除或修改。
1、基本语法
chattr [选项] [+/-/=属性] 文件或目录
常用属性:
属性 | 作用 |
---|---|
a | 文件只能追加内容(不可删除或修改已有内容),适用于日志文件 |
i | 文件不可修改、删除、重命名或创建硬链接(超级用户也无法直接修改) |
A | 不更新文件的访问时间(atime) |
c | 文件压缩存储(需文件系统支持) |
s | 文件删除后,其磁盘空间会被清零(安全删除) |
u | 文件删除后,其内容仍可恢复 |
d | 目录在执行 dump 备份时跳过 |
S | 文件的修改会同步写入磁盘(同步更新) |
b | 不更新文件或目录的存取时间 |
x | 可以直接访问压缩文件中的内容 |
2、 常用操作示例
-
添加属性(+)
chattr +i file.txt # 文件不可修改/删除 chattr +a /var/log/syslog # 只能追加日志
-
移除属性(-)
chattr -i file.txt # 取消不可修改属性 chattr -a /var/log/syslog
-
设置属性(=)
chattr =i file.txt # 仅保留 `i` 属性,移除其他所有属性
-
递归操作目录(-R)
sudo chattr -R +i /path/to/dir # 目录及其内容均不可修改
-
查看属性(使用 lsattr)
lsattr file.txt # 显示文件的扩展属性
3、注意事项
-
需要
root
权限:大多数属性(如i、a
)需用sudo
执行。 -
文件系统支持:仅适用于
ext2/ext3/ext4、xfs、btrfs
等支持扩展属性的文件系统。 -
谨慎使用
-R
:递归操作可能影响目录下所有文件,导致系统异常(如锁住/usr/bin
)。 -
限制root用户:隐藏权限可以作用于
root
用户,设置后root
用户也会被限制
4、典型应用场景
-
保护关键文件
chattr +i /etc/passwd /etc/shadow # 防止用户或密码被修改
-
日志保护
chattr +a /var/log/secure # 日志只能追加,防止篡改
-
禁用临时文件删除
chattr +u /tmp/important.tmp # 允许恢复误删文件
-
恢复被锁定的文件
若误操作锁定了重要文件(如 /bin/chmod),可通过以下步骤恢复:
chattr -i /bin/chmod # 先移除不可修改属性 chmod +x /bin/chmod # 重新赋予执行权限
通过合理使用 chattr
,可以增强文件的安全性和完整性。
2.5 设置文件或目录的访问控制列表(setfacl)
setfacl
是 Linux 中用于设置文件或目录的 访问控制列表(ACL, Access Control List) 的命令,它允许更精细地控制权限,超越传统的chmod
和chown
限制。
1、基本语法
setfacl [选项] [规则] 文件/目录
常用选项:
选项 | 说明 |
---|---|
-m | 修改或添加 ACL 规则 |
-x | 删除指定的 ACL 规则 |
-b | 删除所有 ACL 规则(保留基础权限) |
-R | 递归操作目录及其内容 |
-d | 设置默认 ACL(对新创建的文件/目录生效) |
-k | 删除所有默认 ACL 规则 |
-M | 从文件中读取权限 |
--restore | 恢复文件的ACL记录 |
2、常用规则格式
-
用户规则
u:用户名:权限
示例:给用户 alice 读写权限
setfacl -m u:alice:rw file.txt
-
组规则
g:组名:权限
示例:给组 developers 读执行权限
setfacl -m g:developers:rx dir/
-
默认规则(继承)
d:规则
示例:对新创建的文件继承组读写权限
setfacl -dm g:developers:rw dir/
-
掩码(mask)
限制最大有效权限:
setfacl -m m::r file.txt # 限制所有ACL权限为只读
3、 常用方法使用示例
-
添加用户 ACL
setfacl -m u:alice:rwx /var/www/html/
-
添加组 ACL
setfacl -m g:webadmins:r-x /etc/nginx/
-
递归设置目录及子文件
setfacl -R -m u:bob:rw ~/projects/
-
设置默认 ACL(继承)
setfacl -dm u:alice:rw /shared/
-
删除特定 ACL 规则
setfacl -x u:alice file.txt
-
清除所有 ACL 规则
setfacl -b dir/
4、进阶操作
-
查看文件的ACL规则
getfacl file.txt
-
备份文件的ACL规则
getfacl file.txt > backup.acl
将文件或目录的ACL规则重定向进一个
acl
文件里,必须在该文件的相对路径下进行备份 -
恢复文件的ACL规则
setfacl --restore backup.acl
5、注意事项
-
文件系统支持:
ACL
需要文件系统支持(如ext4、XFS
等),且挂载时需启用acl
选项。 -
权限优先级:
ACL
规则的优先级高于传统chmod
权限。 -
备份恢复:
cp -p
或rsync -a
可保留ACL
,但某些操作可能需要显式指定--acls
。 -
作用范围:
ACL
赋予的权限 是针对某一个人或某个组的,而特殊权限和隐藏权限是针对使用该文件的所有对象
通过 setfacl
,你可以实现更灵活的权限管理,例如让多个用户/组共享目录,而无需创建公共组。
2.6 设置文件或目录默认权限掩码(umask)
umask
是 Linux/Unix 中用于设置文件和目录默认权限掩码的命令。权限掩码决定了新创建文件或目录的初始权限。
-
基本语法
umask [选项] [掩码值]
-
不加参数时:显示当前掩码值(八进制格式)。
-
加掩码值时:临时设置新的掩码(仅对当前会话有效)。
-
-
查看当前 umask
umask # 显示八进制掩码(如 0022) umask -S # 显示符号格式(如 u=rwx,g=rx,o=rx)
-
八进制格式:如 0022,实际权限需通过计算得出,计算方式:实际权限 = 最高权限-umask值
-
符号格式:直接显示用户(u)、组(g)、其他(o)的权限。
-
-
设置 umask
-
临时设置(仅当前会话有效)
umask 0027 # 设置为0027(八进制)
生效范围:仅当前 Shell 或终端会话。
-
永久设置(对所有新会话生效)
将命令添加到 Shell 的配置文件中(如
~/.bashrc
、~/.zshrc
或/etc/profile
):echo "umask 0022" >> ~/.bashrc # 对当前用户永久生效 source ~/.bashrc # 立即生效
-
-
umask 如何影响权限
-
计算方式:
实际权限 = 最高权限-umask值
-
目录:默认最高权限为
777
例如: umask 022 → 目录权限为 755(rwxr-xr-x)。
-
文件:默认最高权限为
666
(且默认无执行权限)例如:
umask 027
→ 文件权限为640
(rw-r-----
)。
-
-
常见 umask 值及效果
umask 目录权限 文件权限 说明 0000 777 666 最大开放权限(不安全) 0022 755 644 默认值(组和其他可读) 0027 750 640 组可读,其他无权限 0077 700 600 仅用户可读写(最严格) -
使用场景示例
# 设置 umask 为 027 umask 027 # 创建文件和目录验证权限 mkdir test_dir # 权限变为 750 (rwxr-x---) touch test_file # 权限变为 640 (rw-r-----)
-
注意事项
-
系统默认
umask
:通常为0022
(在/etc/profile
或/etc/bashrc
中定义)。 -
安全性建议:生产环境中建议使用 027 或 0077 限制组/其他用户的权限。
-
子进程继承:umask 会被子进程(如新启动的 Shell)继承。
-
通过合理设置 umask
,可以确保新创建的文件和目录具有安全的默认权限。