1. 项目概述:为什么权限管理是Linux的基石
干了这么多年运维和开发,我越来越觉得,Linux系统里最容易被新手忽视,但又最要命的部分,就是权限管理。很多人刚接触Linux,觉得敲几个ls -l看看文件权限,知道chmod 755、chown怎么用就差不多了。但真到了实际生产环境,一个配置文件的权限设错了,可能导致服务起不来;一个目录的归属没弄对,自动化脚本就报“Permission denied”;更别提那些因为umask设置不当,导致新创建的文件谁都能读写的安全漏洞了。权限这东西,就像空气,平时感觉不到它的存在,一旦出了问题,立马让你寸步难行。
这一章,我们就来彻底掰扯清楚Linux的权限管理。它绝不仅仅是几个命令的简单组合,而是一套贯穿系统设计哲学的安全模型。从最基本的文件权限位,到深入骨髓的用户与组机制,再到那个默默无闻却至关重要的默认权限掩码umask,每一个细节都关乎系统的稳定与安全。无论你是想搭建个人服务器、从事运维工作,还是进行软件开发,吃透这一章,都能让你避开无数大坑,操作起来更加得心应手。接下来,我会结合大量实际案例和踩坑经验,带你从“知道”走向“精通”。
2. 权限管理的核心思想与模型拆解
2.1 一切皆文件与权限的绑定
Linux有一个著名的设计哲学:“一切皆文件”。这不仅指普通的文本文件、二进制程序,还包括目录、设备(如硬盘、键盘)、进程信息,甚至是网络套接字。既然都是“文件”,那么一套统一的权限管理机制就成为了可能。这套机制的核心,就是将访问控制信息直接绑定在文件系统的一个特殊数据结构——inode上。
当你执行ls -l时,看到的类似-rwxr-xr--的字符串,就是这种绑定的直观体现。它不是一个独立于文件的“属性表”,而是文件元数据的一部分。这种设计的精妙之处在于高效和统一:系统内核在每次访问文件时,无需查询额外的数据库,直接读取inode中的权限位即可做出裁决。理解这一点,就能明白为什么移动(mv)文件通常不会改变权限(因为inode没变),而复制(cp)文件会使用新创建的inode并继承目录的默认权限。
2.2 用户(User)、组(Group)与其他(Other)的三元组模型
Linux权限管理基于一个经典的三元组模型:文件所有者(User)、文件所属组(Group)和其他用户(Other)。这个模型是权限分配的基石。
- 文件所有者(u):通常就是文件的创建者。拥有对该文件最高、最灵活的控制权,可以任意修改文件的权限和归属。
- 文件所属组(g):一个用户组,组内的所有成员共享该组对应的权限。这个设计是为了方便团队协作。例如,一个项目组的所有成员可以同属于一个
dev组,那么将项目目录的组权限设置为可读写,组内所有成员就都能操作了,无需为每个人单独设置。 - 其他用户(o):指既不是文件所有者,也不在文件所属组里的任何其他系统用户。这通常代表了“公众”或“其他人”的访问级别。
这个三元组模型决定了权限分配的粒度。它不像一些现代RBAC(基于角色的访问控制)系统那样可以定义非常复杂的角色关系,但其简单、高效的特点,足以应对绝大多数系统管理和软件运行的需求。每个文件和目录,都独立地存储着针对这三类主体的权限设置。
2.3 读(r)、写(w)、执行(x)权限的深层含义
r、w、x这三个字母是权限的具体表现形式,但它们对普通文件和目录的含义有本质区别,这是新手最容易混淆的地方。
对于普通文件:
- 读(r, 数值4):允许读取文件内容。例如用
cat、less查看,或者被程序加载。 - 写(w, 数值2):允许修改文件内容。包括清空、追加、覆盖。但删除文件的权限不在这里,它由文件所在目录的写权限决定。
- 执行(x, 数值1):允许将文件作为程序或脚本来执行。对于二进制程序(如
/bin/ls)或脚本(如#!/bin/bash开头的Shell脚本),此权限必须开启。
对于目录:
- 读(r, 数值4):允许列出目录下的文件和子目录名称。执行
ls命令成功的前提。 - 写(w, 数值2):允许在目录内创建、删除、重命名文件和子目录。这是关键!要删除一个文件,你需要对该文件所在目录有写权限,而不一定需要对该文件本身有写权限。
- 执行(x, 数值1):允许进入该目录,并将其作为当前工作目录(
cd命令),或访问目录内文件的元数据(inode信息)。这是访问目录内任何文件的前提。如果一个目录没有x权限,即使你有r权限能看见里面有什么,也无法cd进去,也无法访问里面的任何文件。
注意:目录的
x权限常被称为“搜索(search)”权限。没有它,路径名解析就无法通过这个目录节点,导致访问被拒绝。这是很多“Permission denied”错误的根源,尤其是当用户只有目录的r权限而没有x权限时。
3. 权限查看、设置与修改实战详解
3.1 使用 ls -l 和 stat 命令深度解读权限信息
ls -l是最常用的权限查看工具。输出的一行如:-rwxr-xr-- 1 alice devteam 2048 Jun 12 10:00 myscript.sh我们可以将其拆解:
- 第一个字符:文件类型。
-代表普通文件,d代表目录,l代表软链接,等等。 - 后续9个字符:权限位。每3个一组,分别对应用户(u)、组(g)、**其他(o)**的
rwx权限。-代表无此权限。本例中:rwx(用户可读、写、执行),r-x(组员可读、执行,不可写),r--(其他人仅可读)。 - 数字
1:硬链接计数。 alice:文件所有者。devteam:文件所属组。- 后续为文件大小、修改时间和文件名。
对于更详细的信息,可以使用stat命令。stat filename会显示文件的inode编号、权限的八进制和符号表示、所有者和所属组的UID/GID、以及三个时间戳(访问Atime、修改Mtime、状态变更Ctime)。在排查复杂权限问题时,stat命令提供的inode信息和精确时间戳非常有用。
3.2 chmod命令:符号法与数字法的精髓与选用场景
chmod用于修改文件或目录的权限。它有两种主流用法:
1. 符号法(相对修改):通过操作符+(添加)、-(移除)、=(精确设置)来调整特定权限。
- 格式:
chmod [ugoa][+-=][rwx] fileu,g,o,a分别代表用户、组、其他、全部。- 例如:
chmod u+x script.sh:给所有者添加执行权限。chmod g-w,o-r file.txt:移除组员的写权限和其他人的读权限。chmod a=rw config.ini:设置所有人(所有者、组、其他)的权限为可读可写。
- 优点:直观,适合对已有权限进行微调。
- 缺点:需要知道当前权限,且命令较长。
2. 数字法(绝对设置):使用三位八进制数直接设置完整的权限。
- 原理:将
rwx视为二进制位,r=4,w=2,x=1。将需要的权限数值相加,得到一个0-7的数字。7 (4+2+1)=rwx6 (4+2)=rw-5 (4+1)=r-x4=r--0=---
- 格式:
chmod ABC file,其中A、B、C分别是代表用户、组、其他权限的八进制数。- 例如:
chmod 755 myscript:u=rwx (7),g=r-x (5),o=r-x (5)。这是可执行脚本和程序的经典权限。chmod 644 config.txt:u=rw- (6),g=r-- (4),o=r-- (4)。这是配置文件的经典权限,所有者可读写,其他人只读。chmod 700 private_dir:u=rwx (7),g=--- (0),o=--- (0)。目录仅所有者完全控制,其他任何人无法访问。
- 例如:
- 优点:简洁、精确、不易出错,尤其在脚本和自动化任务中广泛应用。
- 缺点:不够直观,需要记忆或计算数值。
选用建议:在交互式命令行中微调权限,用符号法。在脚本、配置文档或需要明确设定固定权限时,强烈推荐使用数字法,因为它能确保结果一致,避免因当前权限状态不同而导致意外。
3.3 chown与chgrp:改变归属权的操作与影响
权限是“谁能做什么”,而归属权是“谁是这个文件的主人/属于哪个组”。改变归属权通常需要root权限。
chown(change owner):改变文件所有者和/或所属组。- 格式:
chown [新所有者][:新所属组] 文件 - 示例:
sudo chown alice logfile.log:将文件所有者改为alice。sudo chown :devteam project/:将目录project/的所属组改为devteam。sudo chown alice:devteam server.conf:同时改变所有者和所属组。
- 重要选项:
-R,递归操作,常用于修改整个目录树的所有权。sudo chown -R alice:devteam /var/www/。
- 格式:
chgrp(change group):专门改变文件所属组。功能是chown的子集。- 格式:
chgrp 新组名 文件 - 示例:
sudo chgrp www-data /var/www/html/index.php
- 格式:
实操心得:在Web服务器部署中,这是一个经典场景。假设Web服务器进程(如Nginx或Apache)以用户www-data运行。你的网站代码由开发者alice上传。为了让Web服务器能读取和执行代码,通常需要:sudo chown -R alice:www-data /var/www/myapp,然后设置目录权限为755(drwxr-xr-x),文件权限为644(-rw-r--r--)。这样,alice可以读写代码,www-data组可以读取和执行,确保了安全与功能的平衡。
3.4 特殊权限位:SUID, SGID, Sticky Bit的机制与风险
除了基本的rwx,还有三个特殊的权限位,它们设置在权限位的**用户执行位(x)**的位置,用另一个八进制数(位于普通权限三位数之前)表示。
1. SUID (Set User ID, 数值4)
- 表现:在文件的用户执行位(x)上,如果该位原本是
x,则显示为s(如-rwsr-xr-x);如果是-,则显示为S(大写,表示设置了SUID但无执行权限,这是无效状态)。 - 作用:当用户执行这个设置了SUID的程序时,在执行期间,进程的有效用户ID(EUID)将临时变更为该文件的所有者,而非当前执行用户。
- 经典案例:
/usr/bin/passwd。普通用户执行passwd修改自己的密码时,需要写入/etc/shadow文件,而这个文件通常只有root可写。passwd命令设置了SUID且所有者为root,使得普通用户在执行它时,临时拥有了root权限去修改shadow文件。 - 风险:SUID是巨大的安全风险点。如果一个属于root且设置了SUID的程序存在漏洞(缓冲区溢出等),攻击者可能利用它获得root shell。原则:尽可能减少系统SUID程序的数量,绝对不要给自己编写的普通程序随意设置SUID。
2. SGID (Set Group ID, 数值2)
- 对文件的作用:类似SUID,但影响的是有效组ID(EGID),临时变更为文件的所属组。
- 对目录的作用(更常用):在目录的组执行位(x)上显示为
s或S。当一个目录设置了SGID位后,任何用户在此目录下新建的文件或子目录,其所属组将自动继承该目录的所属组,而不是创建者的主要组。这对于需要团队协作的共享目录极其有用。 - 设置与示例:
- 设置:
chmod 2775 shared_dir或chmod g+s shared_dir - 查看:
drwxrwsr-x(目录的组权限位是rws) - 效果:用户
bob(主要组为bob)在shared_dir(所属组为devteam)里创建文件newfile,newfile的所属组会自动是devteam,而不是bob。
- 设置:
3. Sticky Bit (粘滞位, 数值1)
- 表现:在目录的其他用户执行位(x)上显示为
t或T(如drwxrwxrwt)。 - 作用:设置在目录上。在设置了粘滞位的目录里,用户只能删除或重命名自己拥有的文件,即使他对该目录有写权限。这防止了用户随意删除他人的文件。
- 经典案例:系统的临时目录
/tmp。权限通常是drwxrwxrwt。所有用户都可以在里面创建文件,但只能删除自己的文件。 - 设置:
chmod 1777 /tmp或chmod o+t /tmp
特殊权限的数字表示法:在chmod的数字法中,它们是一个放在普通权限三位数之前的第四位数。
chmod 4755 file:设置SUID,普通权限755。chmod 2755 dir:设置SGID,普通权限755。chmod 1755 dir:设置Sticky Bit,普通权限755。chmod 6755 file:同时设置SUID和SGID(4+2=6)。
4. 默认权限与umask的深入剖析
4.1 文件与目录的初始权限是如何产生的
当我们创建一个新文件或目录时,系统并不是随机赋予它一个权限,而是遵循一个明确的规则。这个规则基于一个预设的“最大权限”减去一个“权限掩码”。
- 文件的最大默认权限:
666(-rw-rw-rw-)。即,如果没有任何限制,新创建的文件应该是所有人可读可写的。但系统从不默认赋予执行权限(x),因为一个文本文件、数据文件默认可执行是危险且无意义的。 - 目录的最大默认权限:
777(drwxrwxrwx)。目录需要x权限才能进入,所以最大权限包含了执行位。
4.2 umask的作用原理与计算方法
umask(user mask)是一个进程属性,它定义了创建新文件或目录时,需要从最大默认权限中“屏蔽”掉哪些权限。它是一个八进制数。
- 查看当前umask:直接在终端输入
umask。通常普通用户的默认值是0002,root用户的默认值是0022。 - 理解输出:
0002和0022是四位数,但最后三位才是我们关心的。0022表示屏蔽掉**组(g)和其他(o)的写(w)权限。0002表示只屏蔽掉其他(o)**的写(w)权限。 - 权限计算(关键):
- 对于文件:最终权限 =
666-umask(按位相减)。注意,这里不是数学减法,而是权限位的“去除”。更准确的理解是:umask中为1的位,在最终权限里被屏蔽(设为0)。 - 对于目录:最终权限 =
777-umask。
- 对于文件:最终权限 =
计算示例(以umask=0022为例):
- 创建文件:
- 最大权限
666二进制:110 110 110 - umask
022二进制:000 010 010(屏蔽组写和其他写) - 按位“与”操作(更准确):
666 & ~022。~022是取反。 - 结果权限:
110 100 100, 即八进制644(-rw-r--r--)。
- 最大权限
- 创建目录:
- 最大权限
777二进制:111 111 111 - umask
022二进制:000 010 010 - 结果权限:
111 101 101, 即八进制755(drwxr-xr-x)。
- 最大权限
这就是为什么默认情况下,你创建的文件是644,目录是755。
4.3 如何永久与临时修改umask值
临时修改(仅对当前Shell会话有效):
umask 0007:设置为007,屏蔽其他用户的所有权限(rwx)。新创建文件权限为660,目录为770。umask 077:设置为077,屏蔽组和其他用户的所有权限。新创建文件权限为600,目录为700(最严格,仅所有者自己可访问)。
永久修改(对用户或全局生效):
- 针对单个用户:将
umask设置命令写入用户的家目录下的Shell配置文件。- Bash用户:编辑
~/.bashrc,在末尾添加一行,例如umask 002。然后执行source ~/.bashrc使其生效。 - 注意:有时也需要写入
~/.profile,以确保在图形界面登录时也能生效。
- Bash用户:编辑
- 针对所有用户(系统级):修改全局配置文件,如
/etc/profile或/etc/bash.bashrc。但不推荐随意修改全局设置,除非有明确的、统一的安全策略需求。
- 针对单个用户:将
注意事项:在生产服务器上,特别是共享环境的服务器,合理设置umask至关重要。一个过于宽松的umask(如000)可能导致脚本、配置文件被非授权用户读取或修改,引发信息泄露或安全事件。通常,将umask设置为002(便于同组协作)或022(更严格)是常见做法。
5. 权限管理高级应用与实战场景
5.1 ACL(访问控制列表):应对复杂权限需求的利器
标准的三元组(u,g,o)权限模型虽然简单,但在复杂的权限需求面前就显得力不从心。例如,你想让一个特定的用户jack能读取某个文件,但他既不是文件所有者,也不在文件所属组里,用标准模型就无法实现,除非为他单独创建一个组,这很繁琐。这时就需要ACL(Access Control List)。
ACL可以为单个文件或目录设置更精细的访问控制,允许你为任意用户或组指定权限。
- 查看ACL:
getfacl filename- 输出会显示文件的所有者、所属组、以及额外的用户和组条目。
- 设置ACL:
setfacl -m u:jack:r file.txt:为用户jack添加对file.txt的读权限。setfacl -m g:contractors:rwx project/:为组contractors添加对project/目录的读、写、执行权限。setfacl -x u:jack file.txt:删除用户jack的ACL条目。setfacl -b file.txt:删除文件的所有扩展ACL条目,恢复为标准权限。
- 默认ACL(仅对目录有效):可以设置在目录上,使得在该目录下新建的文件和子目录自动继承这些ACL规则。
setfacl -m d:u:jack:rwx shared_dir/:为shared_dir设置默认ACL,以后在此目录下创建的任何新项目,jack都会自动拥有rwx权限。
使用前提:文件系统需要支持ACL(如ext4, xfs等),并且在挂载时启用了acl选项(现代发行版通常默认启用)。你可以通过mount | grep acl或tune2fs -l /dev/sda1 | grep acl来检查。
5.2 权限在系统服务与安全中的关键作用
权限管理是系统安全的基石。一个配置不当的权限,可能就是攻击者入侵的突破口。
- 最小权限原则:这是安全领域的黄金法则。任何用户、进程或服务,都应该只拥有其完成工作所必需的最小权限。例如:
- Web服务器进程(如
www-data)通常不应该有Shell登录权限,其家目录也应严格限制。 - 数据库进程(如
mysql)通常只应访问自己的数据目录和配置文件。 - 避免使用
root用户运行应用程序。永远问自己:这个任务真的需要root权限吗?
- Web服务器进程(如
- 敏感文件权限:
/etc/shadow(存储加密密码):权限应为640或400,所有者root,组shadow,确保只有root和必要的认证程序能读。~/.ssh/目录及内部文件:权限应为700(目录)和600(私钥文件id_rsa),防止私钥泄露。- 用户家目录:通常应为
755(drwxr-xr-x)或750,防止其他用户随意浏览。
- SUID/SGID程序审计:定期检查系统中的SUID/SGID程序,移除不必要的。可以使用命令:
find / -type f -perm /4000 2>/dev/null查找SUID文件。find / -type f -perm /2000 2>/dev/null查找SGID文件。- 对于非系统关键的程序(如
/bin/ping通常需要SUID来使用原始套接字),要特别警惕。
5.3 共享目录的权限规划最佳实践
在团队协作环境中,如何设置一个安全的共享目录是常见需求。假设有一个项目目录/shared/project,需要让dev组的成员都能读写,而其他用户不能访问。
方案一:使用标准权限+SGID(推荐)
- 创建目录并设置所属组:
sudo mkdir -p /shared/project && sudo chown :dev /shared/project - 设置权限和SGID位:
sudo chmod 2775 /shared/project。此时权限为drwxrwsr-x。 - 将团队成员加入
dev组:sudo usermod -aG dev alice,sudo usermod -aG dev bob。 - 效果:任何
dev组成员都可以在/shared/project内创建文件,并且新创建的文件会自动属于dev组,保证了组内成员都能互相读写。SGID位是关键,它避免了每个人创建的文件属于自己的主要组,导致其他组员无法操作。
方案二:使用ACL(更灵活)如果权限需求更复杂,比如还需要给某个特定外部用户只读权限。
- 先设置基础权限:
sudo chmod 775 /shared/project,sudo chown :dev /shared/project。 - 为外部用户
guest添加只读ACL:sudo setfacl -m u:guest:rx /shared/project。 - (可选)设置默认ACL,让新建内容也继承组权限:
sudo setfacl -m d:g:dev:rwx /shared/project。
6. 常见权限问题排查与修复实录
权限问题引发的错误五花八门,但报错信息通常很直接:“Permission denied”。下面是一些典型场景和排查思路。
6.1 “Permission denied” 错误诊断流程图
遇到权限错误,可以按以下步骤排查:
- 确认当前用户:
whoami。 - 确认文件/目录权限:
ls -l /path/to/item。 - 对文件操作失败:
- 读取失败:检查用户对该文件是否有
r权限。 - 写入失败:检查用户对该文件是否有
w权限。注意:如果是删除失败,检查的是对文件所在目录是否有w和x权限。 - 执行失败:检查文件是否有
x权限,并且确认文件确实是可执行格式(脚本要有shebang,二进制文件要匹配架构)。
- 读取失败:检查用户对该文件是否有
- 对目录操作失败:
cd失败或ls失败:检查用户对该目录是否有x权限(进入权限)。没有x权限,r权限也无效。- 在目录内创建/删除文件失败:检查用户对该目录是否有
w和x权限。
- 检查文件所有者/组:确认当前用户是否匹配所有者(u),或是否在所属组(g)中,以应用相应的权限位。
- 检查父目录权限:访问一个文件,需要对其路径上的每一级目录都有
x权限。例如访问/home/alice/docs/file.txt,需要对/、home、alice、docs都有x权限。 - 检查特殊权限和ACL:使用
ls -l看是否有s、t位,使用getfacl查看是否有额外的ACL规则。 - 检查SELinux/AppArmor:如果以上都正常,可能是强制访问控制(如SELinux)在阻止。查看系统日志(
/var/log/audit/audit.log或journalctl)或使用ls -Z查看上下文,临时调试可尝试setenforce 0(仅用于测试,生产环境慎用)。
6.2 典型案例分析与解决
案例1:Web服务器无法读取网站文件
- 现象:访问网站出现“403 Forbidden”或“Permission denied”日志。
- 排查:
- 假设网页根目录是
/var/www/html,Web服务器以www-data用户运行。 ls -l /var/www/html查看目录和文件权限。假设index.html权限是640,所有者是root,组是root。www-data用户既不是root,也不在root组,而640权限只允许所有者读,组员读,其他人无权限。因此www-data无法读取。
- 假设网页根目录是
- 解决:
- 方法A(改归属):
sudo chown -R www-data:www-data /var/www/html,然后设置合理权限(如目录755,文件644)。 - 方法B(改权限):保持所有者是
root(便于管理员维护),将组改为www-data,并给组加读权限:sudo chgrp -R www-data /var/www/html && sudo chmod -R g+r /var/www/html。对于目录,还需要x权限:sudo find /var/www/html -type d -exec chmod g+x {} \;。
- 方法A(改归属):
案例2:用户无法删除自己创建的文件
- 现象:用户
alice在共享目录/shared里创建了文件myfile.txt,但无法删除。 - 排查:
ls -l /shared/myfile.txt显示文件属于alice,她有rw-权限,看起来可以删。- 关键:删除文件的操作对象是目录,不是文件本身。检查目录权限:
ls -ld /shared。发现目录权限可能是drwxr-xr-x(755),所属组是dev。 alice不在dev组里,因此她作为“其他用户(o)”,对目录只有r-x权限(读和执行),没有写(w)权限。没有目录的写权限,就不能删除其中的文件,即使这个文件是她自己的。
- 解决:要么将
alice加入dev组(sudo usermod -aG dev alice),并确保目录组权限有w(如775);要么修改目录的o权限为rwx(chmod o+w /shared,不推荐,太宽松)。
案例3:脚本文件有执行权限却无法执行
- 现象:
./myscript.sh报错Permission denied,但ls -l显示权限是-rwxr-xr-x。 - 排查:
- 检查脚本第一行(shebang):
head -1 myscript.sh。确保指向的解释器路径正确,例如#!/bin/bash。 - 检查脚本文件格式:可能是Windows换行符(CRLF)导致的问题。使用
cat -A myscript.sh查看,行尾如果是^M$,则包含CRLF。或者用file myscript.sh查看。 - 检查文件系统是否挂载为
noexec选项:mount | grep /path/to/script。如果所在分区挂载时有noexec,则上面的任何文件都无法执行。
- 检查脚本第一行(shebang):
- 解决:
- shebang错误:修正为正确的解释器路径。
- 换行符问题:使用
dos2unix myscript.sh转换。 noexec问题:需要重新以允许执行的方式挂载文件系统(修改/etc/fstab并重启或重新挂载),或者将脚本移到其他可执行的文件系统。
6.3 权限管理常用命令速查与技巧
快速备份并恢复权限:在重大修改前,可以备份目录的权限和所有权。
- 备份:
getfacl -R /path/to/dir > /backup/permissions.acl - 恢复:
setfacl --restore=/backup/permissions.acl - (对于不支持ACL的环境,可以用
find配合tar备份元数据,但getfacl/setfacl是更现代和完整的方式)
- 备份:
查找特定权限的文件:
find /path -type f -perm 644:查找权限恰好是644的文件。find /path -type f -perm -644:查找权限包含644所有位的文件(即所有者至少可读写,组员至少可读,其他人至少可读)。find / -type f -perm /4000 -ls 2>/dev/null:查找所有设置了SUID位的文件。
递归修改权限时的谨慎操作:
chmod -R 755 /some/dir:这个命令很危险!它会将目录下所有文件也改为可执行(755)。对于文件,通常我们只需要644。- 安全做法:分别处理目录和文件。
find /some/dir -type d -exec chmod 755 {} \;# 只修改目录find /some/dir -type f -exec chmod 644 {} \;# 只修改文件
- 或者使用更精细的
find命令:find /some/dir -type f -name "*.sh" -exec chmod 755 {} \;只给脚本加执行权限。
使用
--reference参数复制权限:如果你希望文件B拥有和文件A完全一样的权限,不需要手动计算数字。chmod --reference=fileA fileB。这个技巧在需要保持权限一致的场景下非常高效。