Skip to content

文件权限

概述

Linux 是一个多用户操作系统,文件权限机制是其安全性的重要基础。每个文件和目录都有一组权限,控制谁可以读取、写入或执行它。

权限基础

查看权限

使用 ls -l 命令查看文件权限:

bash
$ ls -l
-rw-r--r-- 1 maxwell maxwell 1234 Jan 1 10:00 file.txt
drwxr-xr-x 2 maxwell maxwell 4096 Jan 1 10:00 directory

权限字符串解读

-rw-r--r--
│├─┤├─┤├─┤
│ │  │  └── 其他用户权限(other)
│ │  └───── 所属组权限(group)
│ └──────── 所有者权限(owner/user)
└────────── 文件类型

权限类型

符号含义对文件的意义对目录的意义
r读取(read)查看文件内容列出目录内容
w写入(write)修改文件内容创建/删除文件
x执行(execute)运行程序进入目录
-无权限--

三类用户

类别说明
所有者(Owner/User)文件的创建者
所属组(Group)文件所属的组
其他用户(Others)除上述两类之外的用户

数字表示法

权限可以用八进制数字表示:

权限数值
r(读)4
w(写)2
x(执行)1
-(无)0

计算权限数字

rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 + 0 = 6
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
--- = 0 + 0 + 0 = 0

常见权限组合

数字符号含义
755rwxr-xr-x所有者完全控制,其他人可读和执行
644rw-r--r--所有者可读写,其他人只读
700rwx------只有所有者可访问
777rwxrwxrwx所有人完全控制(不推荐)
600rw-------只有所有者可读写
666rw-rw-rw-所有人可读写

修改权限

chmod - 修改权限

符号模式

bash
# 格式:chmod [ugoa][+-=][rwx] 文件

# 给所有者添加执行权限
$ chmod u+x script.sh

# 移除组的写权限
$ chmod g-w file.txt

# 设置其他用户只读
$ chmod o=r file.txt

# 给所有人添加执行权限
$ chmod a+x script.sh

# 组合使用
$ chmod u+x,g-w,o-rwx file.txt

# 递归修改目录
$ chmod -R u+w directory/

符号说明

符号含义
u所有者(user)
g所属组(group)
o其他用户(others)
a所有人(all)
+添加权限
-移除权限
=设置权限

数字模式

bash
# 设置为 755
$ chmod 755 script.sh

# 设置为 644
$ chmod 644 file.txt

# 递归修改
$ chmod -R 755 directory/

常见使用场景

bash
# 使脚本可执行
$ chmod +x script.sh
$ chmod 755 script.sh

# 保护配置文件
$ chmod 600 config.ini

# 共享目录
$ chmod 775 shared_dir/

# 网站目录
$ chmod 755 /var/www/html/
$ chmod 644 /var/www/html/*.html

修改所有权

chown - 修改所有者

bash
# 修改所有者
$ sudo chown newowner file.txt

# 修改所有者和组
$ sudo chown newowner:newgroup file.txt

# 只修改组
$ sudo chown :newgroup file.txt

# 递归修改
$ sudo chown -R newowner:newgroup directory/

chgrp - 修改所属组

bash
# 修改组
$ sudo chgrp newgroup file.txt

# 递归修改
$ sudo chgrp -R newgroup directory/

特殊权限

SUID(Set User ID)

当可执行文件设置了 SUID 位时,该文件将以文件所有者的权限运行,而不是执行者的权限。

bash
# 查看 SUID 文件
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Jan 1 10:00 /usr/bin/passwd
#   ^-- s 表示 SUID

# 设置 SUID
$ chmod u+s executable
$ chmod 4755 executable

安全提示:SUID 文件存在安全风险,应谨慎使用。

SGID(Set Group ID)

  • 对文件:以文件所属组的权限运行
  • 对目录:目录中创建的文件继承目录的组
bash
# 设置 SGID
$ chmod g+s directory/
$ chmod 2755 directory/

# 查看
$ ls -ld directory/
drwxr-sr-x 2 user group 4096 Jan 1 10:00 directory/
#      ^-- s 表示 SGID

Sticky Bit

设置在目录上时,只有文件所有者、目录所有者或 root 才能删除或移动其中的文件。

bash
# 设置 sticky bit
$ chmod +t directory/
$ chmod 1777 directory/

# 查看
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Jan 1 10:00 /tmp
#        ^-- t 表示 sticky bit

特殊权限数字

权限数字
SUID4
SGID2
Sticky1
bash
# 完整的四位权限
$ chmod 4755 file    # SUID + rwxr-xr-x
$ chmod 2755 dir     # SGID + rwxr-xr-x
$ chmod 1777 dir     # Sticky + rwxrwxrwx

默认权限:umask

umask 决定新创建文件和目录的默认权限。

理解 umask

bash
# 查看当前 umask
$ umask
0022

# 计算默认权限
# 文件默认权限 = 666 - umask = 666 - 022 = 644
# 目录默认权限 = 777 - umask = 777 - 022 = 755

设置 umask

bash
# 临时设置
$ umask 027
# 文件默认权限:640
# 目录默认权限:750

# 永久设置(添加到 ~/.bashrc)
$ echo "umask 027" >> ~/.bashrc

常见 umask 值

umask文件权限目录权限说明
022644755系统默认
027640750较安全
077600700只有所有者可访问
002664775组成员可写

访问控制列表(ACL)

ACL 提供比传统权限更细粒度的访问控制。

查看 ACL

bash
$ getfacl file.txt
# file: file.txt
# owner: maxwell
# group: maxwell
user::rw-
group::r--
other::r--

设置 ACL

bash
# 给特定用户设置权限
$ setfacl -m u:alice:rw file.txt

# 给特定组设置权限
$ setfacl -m g:developers:rx directory/

# 设置默认 ACL(对新文件生效)
$ setfacl -d -m u:alice:rw directory/

# 删除 ACL
$ setfacl -x u:alice file.txt

# 删除所有 ACL
$ setfacl -b file.txt

# 递归设置
$ setfacl -R -m u:alice:rx directory/

ACL 示例

bash
# 场景:让 alice 可以读取私有文件
$ setfacl -m u:alice:r secret.txt

$ getfacl secret.txt
# file: secret.txt
# owner: maxwell
# group: maxwell
user::rw-
user:alice:r--
group::---
other::---

文件属性

lsattr - 查看属性

bash
$ lsattr file.txt
----i------------ file.txt

chattr - 修改属性

bash
# 设置不可修改(immutable)
$ sudo chattr +i file.txt
# 即使 root 也无法修改或删除

# 移除不可修改
$ sudo chattr -i file.txt

# 只能追加(append only)
$ sudo chattr +a logfile.txt

# 安全删除
$ sudo chattr +s file.txt

常用属性

属性说明
i不可修改
a只能追加
s安全删除
u可恢复删除
c自动压缩

权限实践

网站目录权限

bash
# 设置所有者为 www-data
$ sudo chown -R www-data:www-data /var/www/html

# 目录权限
$ sudo find /var/www/html -type d -exec chmod 755 {} \;

# 文件权限
$ sudo find /var/www/html -type f -exec chmod 644 {} \;

SSH 密钥权限

bash
# ~/.ssh 目录
$ chmod 700 ~/.ssh

# 私钥
$ chmod 600 ~/.ssh/id_rsa

# 公钥
$ chmod 644 ~/.ssh/id_rsa.pub

# authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

共享目录

bash
# 创建共享目录
$ sudo mkdir /shared

# 设置组
$ sudo chgrp developers /shared

# 设置 SGID(新文件继承组)
$ sudo chmod 2775 /shared

脚本文件

bash
# 使脚本可执行
$ chmod 755 script.sh

# 或只对所有者
$ chmod 700 private_script.sh

排查权限问题

检查清单

bash
# 1. 查看文件权限
$ ls -la file.txt

# 2. 查看当前用户和组
$ id

# 3. 查看文件 ACL
$ getfacl file.txt

# 4. 查看目录权限链
$ namei -l /path/to/file.txt

# 5. 检查 SELinux(如果启用)
$ ls -Z file.txt
$ getenforce

常见问题

  1. 无法执行脚本

    bash
    $ chmod +x script.sh
  2. Permission denied 访问目录

    bash
    # 需要目录的 x 权限
    $ chmod +x directory/
  3. 无法删除文件

    bash
    # 检查目录的 w 权限
    $ chmod +w parent_directory/
  4. SSH 密钥不工作

    bash
    $ chmod 600 ~/.ssh/id_rsa
    $ chmod 700 ~/.ssh

小结

本章介绍了 Linux 文件权限的核心概念:

  • 基本权限:读(r)、写(w)、执行(x)
  • 三类用户:所有者、组、其他
  • 权限表示:符号(rwx)和数字(755)
  • 修改权限chmodchownchgrp
  • 特殊权限:SUID、SGID、Sticky Bit
  • 默认权限:umask
  • 高级控制:ACL

正确设置文件权限是系统安全的重要组成部分。在日常使用中,遵循最小权限原则——只赋予必要的权限。


上一章:文件基本操作

下一章:文件查找