Linux文件权限管理全解
管理目录和文件属性
-
查看文件属性 (ls -l 输出详解)
- 示例:
drwxr-xr-x. 3 root root 16 May 28 09:28 home - 字段解析:
- d: 文件类型 (
d=目录,-=普通文件,l=符号链接,c=字符设备,b=块设备,s=套接字,p=管道) - rwxr-xr-x: 权限 (9个字符,分三组)
- 1-3: 属主 (owner) 权限 (
u) - 4-6: 属组 (group) 权限 (
g) - 7-9: 其他用户 (others) 权限 (
o)
- 1-3: 属主 (owner) 权限 (
- . (有时是
+):.表示无额外属性 (如 SELinux context 未完全列出),+表示设置了 ACL (访问控制列表)。 - 3: 硬链接计数 (对于目录,通常表示其直接子目录的数量 + 2 (
.和..)) - root: 属主 (owner)
- root: 属组 (group)
- 16: 大小 (对于目录,通常是文件系统元数据占用的空间,不是目录内容的总大小;对于文件,是实际内容大小;单位为字节
B) - May 28 09:28: 最后修改时间 (mtime)
- home: 文件或目录名
- d: 文件类型 (
- 示例:
-
文件权限表示法
- 字符表示:
r= 读 (Read)w= 写 (Write)x= 执行 (eXecute)-= 无此权限
- 数字 (八进制) 表示: (将每组权限视为一个 3 位二进制数,转换为十进制)
r= 4w= 2x= 1-= 0
- 示例:
rwxr-xr--=7(4+2+1)5(4+0+1)4(4+0+0) => 数字表示 754
- 字符表示:
-
设置修改文件权限 (chmod 命令)
-
a. 使用数值改变权限:
chmod 777 test1 # 给 test1 的属主(u)、属组(g)、其他用户(o) 都赋予 rwx 权限 (4+2+1=7) chmod 644 file.txt # 属主 rw- (6), 属组 r-- (4), 其他 r-- (4) chmod 750 script.sh # 属主 rwx (7), 属组 r-x (5), 其他 --- (0) -
b. 使用字母改变权限:
-
操作对象:
u= 属主 (user/owner)g= 属组 (group)o= 其他用户 (others)a= 所有用户 (all, 等价于ugo)
-
操作符:
+= 添加权限-= 移除权限== 设置确切权限 (覆盖原有)
-
常用示例:
chmod o+w test2 # 给 test2 的其他用户添加写权限 chmod go-rw test3 # 给 test3 的属组和其他用户移除读写权限 chmod a-rw test4 # 给 test4 的所有用户移除读写权限 chmod u+x script.sh # 允许文件属主执行文件 chmod g=rx sharedir # 设置属组用户只能读和执行目录(不可写) chmod a+rw public.log # 允许所有用户读和写文件 chmod ug+r confidential # 允许文件属主和属组用户读文件 -
递归修改 (-R 参数): 改变整个目录树及其内容的权限 (谨慎使用!)。
chmod -R g+w /home/test5/ # 给 /home/test5/ 目录下所有文件和子目录的属组添加写权限
-
-
-
修改目录或文件的所有者/属组
-
chown (Change Owner): 设置文件或目录的属主和/或属组。
-
-R: 递归操作 (用于目录) -
语法:
chown [新属主] [文件/目录] # 仅改属主 chown [新属主]:[新属组] [文件/目录] # 同时改属主和属组 chown :[新属组] [文件/目录] # 仅改属组 (等价于 `chgrp`) -
示例:
chown linux /home/test6 # 将 /home/test6 的属主改为用户 `linux` chown linux:linux /home/test7 # 将 /home/test7 的属主改为用户 `linux`,属组改为组 `linux`
-
-
chgrp (Change Group): 专门设置文件或目录的属组。(功能已被
chown包含,但有时更清晰)-
-R: 递归操作 (用于目录) -
语法:
chgrp [新属组] [文件/目录] -
示例:
chgrp linux /home/test8 # 将 /home/test8 的属组改为组 `linux` chgrp -R linux /home/test9/ # 递归地将 /home/test9/ 目录下所有内容的属组改为组 `linux`
-
-
特殊权限 (SUID, SGID, Sticky Bit)
-
SUID (Set User ID) u+s:
-
作用: 应用于可执行的二进制文件。
-
效果: 当用户执行这个文件时,进程将临时拥有文件属主的权限,而不是执行者的权限。常用于需要提升权限执行特定任务的程序 (如
passwd,sudo)。 -
设置方法:
chmod u+s /path/to/binary # 字符法 chmod 4xxx /path/to/binary # 数字法 (xxx 代表文件原有的 ugo 权限数字,SUID=4) # 示例:给 mkdir 设置 SUID (通常不建议!仅作演示) chmod u+s /usr/bin/mkdir # 或 chmod 4755 /usr/bin/mkdir -
显示: 在属主的
x权限位置上显示为s(如果属主原来有x) 或S(大写 S,如果属主原来没有x)。
-
-
SGID (Set Group ID) g+s:
-
作用于文件: 应用于可执行的二进制文件。
- 效果: 当用户执行这个文件时,进程将临时拥有文件属组的权限。较少用于文件。
-
作用于目录: (更常用!)
- 效果: 在该目录下新建的文件或子目录,其属组将自动继承该目录的属组 (而不是创建者的主要组)。常用于需要协作的共享目录。
-
设置方法:
chmod g+s /path/to/file_or_dir # 字符法 chmod 2xxx /path/to/file_or_dir # 数字法 (xxx 代表文件原有的 ugo 权限数字,SGID=2) # 示例:给目录 /tmp/test 设置 SGID chmod g+s /tmp/test # 或 chmod 2755 /tmp/test -
显示: 在属组的
x权限位置上显示为s(如果属组原来有x) 或S(大写 S,如果属组原来没有x)。
-
-
Sticky Bit o+t:
-
作用: 应用于目录。
-
效果: 在设置了粘滞位的目录中,用户只能删除或重命名自己拥有属主权限的文件或目录,即使该用户对该目录拥有写 (
w) 权限。root用户不受此限制。经典例子:系统临时目录/tmp。 -
设置方法:
chmod o+t /path/to/directory # 字符法 chmod 1xxx /path/to/directory # 数字法 (xxx 代表目录原有的 ugo 权限数字,Sticky=1) # 示例:给目录 /tmp/test 设置 Sticky Bit chmod o+t /tmp/test # 或 chmod 1755 /tmp/test -
显示: 在其他用户的
x权限位置上显示为t(如果其他用户原来有x) 或T(大写 T,如果其他用户原来没有x)。
-
重要补充:
- 数字法表示特殊权限:
4xxx,2xxx,1xxx中的xxx必须替换为文件/目录原有的基础权限数字。特殊权限值 (4,2,1) 是加在基础权限数字前面的第四位。例如:- 原有权限
755(rwxr-xr-x) +SUID->4755 - 原有权限
755+SGID->2755 - 原有权限
755+Sticky->1755 - 原有权限
755+SGID+Sticky->3755
- 原有权限
- SUID/SGID 安全警告: 不当设置
SUID/SGID可造成严重安全隐患。只应在明确理解其作用且必要的情况下设置,并确保目标程序本身安全可靠。
默认权限与 umask
- umask: 是一个掩码值,决定了新创建文件或目录的初始权限。它定义了需要从默认最大权限中屏蔽掉的权限位。
- 默认最大权限:
- 目录:
rwxrwxrwx(777) - 文件:
rw-rw-rw-(666) (文件创建时通常不会默认有执行权限x)
- 目录:
- umask 计算权限:
- 新目录权限 = 777 - umask
- 新文件权限 = 666 - umask (如果结果导致有执行位
x,系统通常会自动屏蔽掉文件的计算得到的x位)
- 常见默认值:
- root 用户:
umask通常为 0022- 新目录权限: 777 - 022 = 755 (
rwxr-xr-x) - 新文件权限: 666 - 022 = 644 (
rw-r--r--)
- 新目录权限: 777 - 022 = 755 (
- 普通用户:
umask通常为 0002- 新目录权限: 777 - 002 = 775 (
rwxrwxr-x) - 新文件权限: 666 - 002 = 664 (
rw-rw-r--)
- 新目录权限: 777 - 002 = 775 (
- root 用户:
- 查看 umask: 直接运行
umask命令。 - 修改 umask:
umask [新值](例如umask 077会设置更严格的权限)。修改通常只在当前 shell 会话有效,如需永久修改需写入 shell 配置文件 (如~/.bashrc)。
ACL 权限 (访问控制列表)
ACL 提供了比传统 Unix 权限 (属主/属组/其他) 更精细的访问控制能力,允许为特定用户或特定组设置特定权限。
-
设置 ACL (setfacl):
# 基本语法: setfacl -m [规则] [文件/目录] # 规则格式: # u:[用户名]:[权限] # 针对特定用户 # g:[组名]:[权限] # 针对特定组 # m:[权限] # 设置有效权限掩码 (mask) # d:[规则] # 设置默认规则 (用于目录继承) # 权限: r, w, x (组合使用,如 rw, r-x)# 示例: setfacl -m u:admin:rw a.txt # 允许用户 admin 对文件 a.txt 有读写权限 setfacl -m g:lisi:rw a.txt # 允许组 lisi 对文件 a.txt 有读写权限 setfacl -m u:admin:rwx b/ # 允许用户 admin 对目录 b/ 有 rwx 权限 (访问目录本身) setfacl -m g:lisi:rwx b/ # 允许组 lisi 对目录 b/ 有 rwx 权限 (访问目录本身)# 设置默认 ACL (继承): 允许 admin 对目录 b/ 有 rwx 权限,且在此目录下新建的文件/目录自动继承此 ACL 规则 setfacl -m u:admin:rwx b/ # 设置访问 ACL (当前目录) setfacl -m d:u:admin:rwx b/ # 设置默认 ACL (继承给子项)# 设置默认 ACL (继承) 并同时设置当前目录权限 (常用简写): setfacl -m d:u:admin:rwx b/ # 这也会自动设置当前目录的访问 ACL (如果需要) # 更精确的写法通常是分开设置访问 ACL 和默认 ACL -
查看 ACL (getfacl):
getfacl a.txt # 查看文件 a.txt 的 ACL getfacl b/ # 查看目录 b/ 的 ACL (包含默认 ACL) -
删除 ACL:
setfacl -x u:admin a.txt # 删除文件 a.txt 上用户 admin 的特定 ACL 条目 setfacl -x g:lisi a.txt # 删除文件 a.txt 上组 lisi 的特定 ACL 条目 setfacl -k b/ # 删除目录 b/ 的 *所有* 默认 ACL 规则 (停止继承) setfacl -b a.txt # 删除文件 a.txt 的 *所有* ACL 规则 (包括基本权限外的所有条目) setfacl -b b/ # 删除目录 b/ 的 *所有* ACL 规则 (包括访问 ACL 和默认 ACL) -
递归设置 ACL (-R): (谨慎使用!)
setfacl -R -m u:admin:rwx b/ # 递归设置目录 b/ 下所有*现有*文件和子目录,允许 admin rwx setfacl -R -m d:u:admin:rwx b/ # 递归设置目录 b/ 下所有*现有*子目录的默认 ACL (继承) # 注意: 同时修改现有文件和设置未来继承通常需要两条命令结合 -R 和 -d
