源本科技 | 码上会

Linux 文件权限与设置

2025/12/23
133
0

Linux 的文件权限机制是其安全模型的核心,它精确控制谁可以读取、修改或执行文件和目录,从而保护系统和用户数据免受未授权访问。通过 chmodchown 等命令,用户可以灵活地管理这些权限。


三大基本权限类型

每个文件或目录都具备以下三种基本权限:

权限符号

含义

对文件的作用

对目录的作用

r (read)

读取

查看文件内容

列出目录中的文件(ls

w (write)

写入

修改 / 删除文件内容

在目录中创建、删除或重命名文件

x (execute)

执行

运行脚本或程序

进入目录(cd

注意:对目录而言,没有 x 权限就无法进入,即使有 r 权限也只能看到文件名(若同时无 x,甚至无法获取文件属性)。


权限的三类归属对象

权限按用户身份分为三个层级:

类别

符号

说明

User(所有者)

u

创建文件的用户

Group(所属组)

g

文件所属的用户组成员

Others(其他用户)

o

系统上除所有者和组成员外的所有人

All(全部)

a

等同于 ugo,作用于所有三类用户

权限在文件系统中以 9 个字符的形式呈现,分为三组:

rwx rwx rwx
│   │   └── Others(其他用户)
│   └────── Group(所属组)
└────────── User(所有者)

如何查看文件权限

方法 1:ls -l

最常用

$ ls -l NarX.txt
-rw-r--r-- 1 alice developers 46 Apr 14 16:37 NarX.txt

字段解析:

  • 第 1 位:- 表示普通文件,d 表示目录

  • 第 2–10 位:rw-r--r-- → 所有者可读写,组和其他人仅可读

  • 后续字段:链接数、所有者、所属组、大小、修改时间、文件名

方法 2:stat

查看详细元数据

$ stat hoops

输出包含权限(以八进制和符号形式)、inode、访问 / 修改 / 变更时间等。

方法 3:namei -l

查看路径中每一级的权限

适用于排查“权限被拒绝”错误,检查从根目录到目标文件的完整路径权限。


修改权限

chmod(change mode)用于修改文件权限,支持两种表示法:

1. 符号表示法

语法:
chmod [who][operator][permissions] file

  • whougoa

  • operator+(添加)、-(移除)、=(设为)

  • permissionsrwx

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

# 移除其他用户的写和执行权限
$ chmod o-wx data.txt

# 设置组和其他人只有读权限
$ chmod go=r file.txt

# 同时操作多类用户
$ chmod ug+rw,o-rwx report.pdf

技巧:chmod a-x file 可快速移除所有人的执行权限。


2. 八进制表示法

将每组权限转换为数字:

  • r = 4

  • w = 2

  • x = 1
    权限值 = 各位之和(如 rwx = 4+2+1 = 7)

三位八进制数分别对应:所有者 · 组 · 其他人

权限组合

八进制值

常见用途

rwx

7

完全控制(慎用)

rw-

6

普通文件默认(如文本)

r-x

5

可执行文件(如脚本)

r--

4

只读文件

---

0

无任何权限

# 设置权限为:所有者(rw-)、组(r--)、其他人(r--)
$ chmod 644 config.ini

# 设置脚本:所有者(rwx)、组(rx)、其他人(rx)
$ chmod 755 deploy.sh

# 完全禁止访问(仅所有者可读写)
$ chmod 600 private.key

推荐:普通文件用 644,可执行文件用 755,敏感文件用 600


特殊权限

除了基本权限,Linux 还提供三种特殊权限位:

特殊权限

符号

八进制位

作用

setuid

s(在 user 的 x 位)

4xxx

执行时以文件所有者身份运行(如 passwd 命令)

setgid

s(在 group 的 x 位)

2xxx

执行时以文件所属组身份运行;对目录则使新文件继承目录的组

Sticky Bit

t(在 others 的 x 位)

1xxx

文件所有者可删除目录中的文件(常用于 /tmp

# 设置 setuid(如让普通用户临时获得 root 权限执行某程序)
$ chmod u+s /usr/bin/mytool

# 设置 setgid(使目录下新建文件自动归属该目录的组)
$ chmod g+s /shared/project/

# 设置 sticky bit(保护公共目录)
$ chmod +t /tmp/shared/

安全提示:setuid 程序需谨慎编写,避免提权漏洞。


更改文件归属:chownchgrp

权限生效的前提是正确的所有权

更改所有者和所属组

# 仅更改所有者
$ chown alice file.txt

# 同时更改所有者和组
$ chown alice:developers file.txt

# 递归更改整个目录
$ chown -R alice:developers /project/

仅更改组(也可用 chgrp

$ chgrp admins report.log

重点总结表

操作

命令示例

说明

查看权限

ls -l file

显示符号权限

添加执行权

chmod +x script.sh

所有用户均可执行

设为只读

chmod 444 data.txt

所有人只能读

安全私有文件

chmod 600 secret.key

仅所有者可读写

公共脚本

chmod 755 app.sh

所有者全权,他人可读可执行

实时监控日志

tail -f /var/log/syslog

r 权限

保护共享目录

chmod 1777 /tmp

sticky bit + 全开放


思考题

  1. 为什么一个目录必须有 x 权限才能被 cd 进入?仅有 r 权限够吗?

  2. 如果你运行 chmod 777 sensitive.conf,会带来哪些安全风险?

  3. 如何设置一个目录,使得团队成员都能在其中创建文件,且新文件自动归属团队组?