Linux 权限管理细节详解

Linux 权限管理细节详解

Linux 是典型的多用户、多任务操作系统 ,权限管理是 Linux 安全体系的核心之一。

它决定了:

  • 谁可以读取文件
  • 谁可以修改文件
  • 谁可以执行程序
  • 谁可以进入目录
  • 谁可以管理系统资源

一、Linux 权限的基本模型

Linux 中每个文件或目录都有三类权限对象:

对象 含义
所有者 user / owner 文件的拥有者
所属组 group 文件所属的用户组
其他用户 others 除所有者和所属组以外的其他用户

每类对象都有三种基本权限:

权限 字母 数字 对文件的含义 对目录的含义
r 4 可以查看文件内容 可以列出目录内容
w 2 可以修改文件内容 可以在目录中创建、删除、重命名文件
执行 x 1 可以执行该文件 可以进入该目录

二、查看文件权限

常用命令:

bash 复制代码
ls -l

示例输出:

bash 复制代码
-rwxr-xr-- 1 alice dev 1024 Apr 25 10:00 script.sh

逐段解释:

text 复制代码
-rwxr-xr--
│││ │││ │││
│││ │││ └┴┴── 其他用户权限:r--
│││ └┴┴────── 所属组权限:r-x
│└┴────────── 所有者权限:rwx
└──────────── 文件类型

完整含义:

部分 含义
- 普通文件
rwx 所有者 alice 可读、可写、可执行
r-x 所属组 dev 可读、可执行,不可写
r-- 其他用户只读
alice 文件所有者
dev 文件所属组
1024 文件大小
script.sh 文件名

三、文件类型标识

权限字符串第一位表示文件类型:

标识 类型
- 普通文件
d 目录
l 符号链接 / 软链接
c 字符设备
b 块设备
s socket 文件
p 管道文件

示例:

bash 复制代码
drwxr-xr-x 2 root root 4096 Apr 25 10:00 /etc
lrwxrwxrwx 1 root root   11 Apr 25 10:00 link -> /etc/hosts

四、权限的数字表示法

Linux 权限可以用数字表示:

权限 数字
r 4
w 2
x 1

组合方式是相加:

权限 数字
--- 0
--x 1
-w- 2
-wx 3
r-- 4
r-x 5
rw- 6
rwx 7

例如:

bash 复制代码
chmod 755 script.sh

表示:

text 复制代码
7 = rwx  所有者可读、写、执行
5 = r-x  所属组可读、执行
5 = r-x  其他用户可读、执行

即:

bash 复制代码
-rwxr-xr-x

五、常见权限组合

1. 755

bash 复制代码
-rwxr-xr-x

常用于:

  • 脚本文件
  • 可执行程序
  • 普通目录

含义:

  • 所有者:读、写、执行
  • 组用户:读、执行
  • 其他用户:读、执行

示例:

bash 复制代码
chmod 755 deploy.sh

2. 644

bash 复制代码
-rw-r--r--

常用于:

  • 普通文本文件
  • 配置文件
  • 静态资源文件

含义:

  • 所有者:读、写
  • 组用户:只读
  • 其他用户:只读

示例:

bash 复制代码
chmod 644 config.txt

3. 600

bash 复制代码
-rw-------

常用于:

  • 私钥文件
  • 敏感配置
  • 用户凭据文件

示例:

bash 复制代码
chmod 600 ~/.ssh/id_rsa

SSH 私钥通常必须是 600,否则可能报错:

bash 复制代码
WARNING: UNPROTECTED PRIVATE KEY FILE!

4. 700

bash 复制代码
-rwx------

常用于:

  • 私有脚本
  • 用户私有目录

示例:

bash 复制代码
chmod 700 ~/.ssh

5. 777

bash 复制代码
-rwxrwxrwx

表示所有人都可以读、写、执行。

不推荐使用,尤其是在服务器上:

bash 复制代码
chmod 777 file

风险:

  • 任意用户都能修改
  • 容易被植入恶意脚本
  • 可能造成权限越权

六、chmod 修改权限

chmod 用于修改文件或目录权限。

1. 数字方式

bash 复制代码
chmod 755 file.sh
chmod 644 config.conf
chmod 600 private.key

递归修改目录:

bash 复制代码
chmod -R 755 /var/www/html

注意:
-R 会递归影响目录下所有文件,使用时要谨慎。


2. 符号方式

格式:

bash 复制代码
chmod [对象][操作][权限] 文件

对象:

符号 含义
u 所有者 user
g 所属组 group
o 其他用户 others
a 所有人 all

操作:

符号 含义
+ 增加权限
- 移除权限
= 设置为指定权限

示例:

bash 复制代码
chmod u+x script.sh

给所有者增加执行权限。

bash 复制代码
chmod g-w file.txt

去掉所属组的写权限。

bash 复制代码
chmod o-r file.txt

去掉其他用户的读权限。

bash 复制代码
chmod a+r README.md

所有人增加读权限。

bash 复制代码
chmod u=rwx,g=rx,o=r file.sh

设置为:

bash 复制代码
-rwxr-xr--

七、chown 修改所有者

chown 用于修改文件所有者和所属组。

1. 修改所有者

bash 复制代码
sudo chown alice file.txt

表示把 file.txt 的所有者改为 alice


2. 修改所有者和所属组

bash 复制代码
sudo chown alice:dev file.txt

表示:

  • 所有者改为 alice
  • 所属组改为 dev

3. 递归修改

bash 复制代码
sudo chown -R www-data:www-data /var/www/html

常用于 Web 服务目录。


八、chgrp 修改所属组

chgrp 只修改所属组。

bash 复制代码
sudo chgrp dev file.txt

递归修改:

bash 复制代码
sudo chgrp -R dev /project

九、目录权限和文件权限的区别

这是 Linux 权限管理中非常重要的一点。

1. 文件权限

对于普通文件:

权限 作用
r 查看文件内容
w 修改文件内容
x 执行文件

例如:

bash 复制代码
-rw-r--r-- file.txt

表示文件可以被读取,但不能执行。


2. 目录权限

对于目录:

权限 作用
r 可以列出目录内容,如 ls
w 可以创建、删除、重命名目录内文件
x 可以进入目录,如 cd

目录的 x 权限非常关键。

例如:

bash 复制代码
chmod 600 /testdir

即使有读写权限,没有执行权限,也无法进入目录。

常见目录权限:

bash 复制代码
chmod 755 /some/dir

表示:

  • 所有者可进入、查看、修改
  • 其他用户可进入、查看
  • 其他用户不能创建或删除文件

十、删除文件需要什么权限?

很多人误以为删除文件需要文件本身的写权限,其实不是。

删除文件需要对其所在目录有写权限和执行权限。

例如:

bash 复制代码
-r--r--r-- file.txt

即使 file.txt 本身不可写,如果你对它所在目录有 wx 权限,仍然可以删除它。

原因是:

  • 删除文件本质上是修改目录项
  • 不是修改文件内容

十一、umask 默认权限掩码

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

查看当前 umask:

bash 复制代码
umask

常见输出:

bash 复制代码
0022

默认权限规则:

类型 理论最大权限
文件 666
目录 777

实际权限:

text 复制代码
实际权限 = 最大权限 - umask

例如:

bash 复制代码
umask 022

新建文件:

text 复制代码
666 - 022 = 644

新建目录:

text 复制代码
777 - 022 = 755

所以:

bash 复制代码
touch a.txt
mkdir test
ls -l

通常会看到:

bash 复制代码
-rw-r--r-- a.txt
drwxr-xr-x test

临时修改 umask:

bash 复制代码
umask 027

永久修改可以写入:

bash 复制代码
~/.bashrc
/etc/profile
/etc/login.defs

十二、特殊权限:SUID、SGID、Sticky Bit

除了 rwx,Linux 还有三种特殊权限:

特殊权限 数字 作用
SUID 4 让执行者临时拥有文件所有者权限
SGID 2 让执行者临时拥有文件所属组权限;用于目录时可继承组
Sticky Bit 1 目录中只有文件所有者/root 能删除自己的文件

它们会出现在权限字符串中的执行位上。


1. SUID

SUID 作用于可执行文件

典型例子:

bash 复制代码
ls -l /usr/bin/passwd

可能看到:

bash 复制代码
-rwsr-xr-x 1 root root ... /usr/bin/passwd

注意这里是:

text 复制代码
rws

而不是:

text 复制代码
rwx

passwd 命令需要修改 /etc/shadow,普通用户本来没有权限修改。

但因为 /usr/bin/passwd 拥有 SUID,所以普通用户执行它时,会临时拥有文件所有者 root 的权限。

设置 SUID:

bash 复制代码
chmod u+s file

数字方式:

bash 复制代码
chmod 4755 file

取消 SUID:

bash 复制代码
chmod u-s file

安全提醒:

  • 不要随意给脚本或程序加 SUID
  • SUID 程序如果有漏洞,可能导致提权

2. SGID

SGID 可以作用于文件,也可以作用于目录。

作用于可执行文件

执行者临时拥有文件所属组权限。

设置:

bash 复制代码
chmod g+s file

数字方式:

bash 复制代码
chmod 2755 file

作用于目录

这是非常常见的协作目录用法。

如果一个目录设置了 SGID,则目录中新建的文件会自动继承该目录的所属组。

示例:

bash 复制代码
sudo mkdir /project
sudo chown root:dev /project
sudo chmod 2775 /project

查看:

bash 复制代码
drwxrwsr-x root dev /project

之后 dev 组成员在 /project 中创建的文件,所属组都会是 dev

适用于:

  • 团队共享目录
  • 项目协作目录
  • Web 项目目录

3. Sticky Bit

Sticky Bit 常用于公共可写目录,例如 /tmp

查看:

bash 复制代码
ls -ld /tmp

通常看到:

bash 复制代码
drwxrwxrwt  root root /tmp

最后一位是:

text 复制代码
t

含义:

  • 所有人都可以在 /tmp 创建文件
  • 但只能删除自己创建的文件
  • root 可以删除任何文件

设置 Sticky Bit:

bash 复制代码
chmod +t /shared

数字方式:

bash 复制代码
chmod 1777 /shared

取消:

bash 复制代码
chmod -t /shared

十三、ACL:更细粒度的权限控制

传统 Linux 权限只有:

  • owner
  • group
  • others

如果想给某个特定用户单独授权,可以使用 ACL。

查看 ACL:

bash 复制代码
getfacl file.txt

给用户 alice 添加读写权限:

bash 复制代码
setfacl -m u:alice:rw file.txt

给用户 bob 添加只读权限:

bash 复制代码
setfacl -m u:bob:r file.txt

给组 dev 添加读写执行权限:

bash 复制代码
setfacl -m g:dev:rwx /project

递归设置 ACL:

bash 复制代码
setfacl -R -m u:alice:rwx /project

设置默认 ACL,让目录下新建文件继承权限:

bash 复制代码
setfacl -m d:u:alice:rwx /project

删除 ACL:

bash 复制代码
setfacl -x u:alice file.txt

清空所有 ACL:

bash 复制代码
setfacl -b file.txt

如果 ls -l 看到权限后面有 +

bash 复制代码
-rw-r--r--+ file.txt

说明该文件有 ACL。


十四、root、sudo 与权限提升

1. root 用户

root 是 Linux 超级管理员,UID 为 0。

查看当前用户:

bash 复制代码
whoami

查看用户 ID:

bash 复制代码
id

root 几乎可以绕过普通权限限制,所以使用时要谨慎。


2. sudo

sudo 允许普通用户以其他用户身份执行命令,默认是 root。

示例:

bash 复制代码
sudo apt update
sudo systemctl restart nginx

查看当前用户可执行哪些 sudo 命令:

bash 复制代码
sudo -l

sudo 配置文件:

bash 复制代码
/etc/sudoers

建议使用:

bash 复制代码
sudo visudo

而不是直接编辑 /etc/sudoers

因为 visudo 会检查语法,避免配置错误导致 sudo 不可用。


十五、用户和用户组管理

1. 查看用户信息

bash 复制代码
id username

示例:

bash 复制代码
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(dev)

2. 添加用户

bash 复制代码
sudo useradd -m alice

设置密码:

bash 复制代码
sudo passwd alice

3. 添加用户组

bash 复制代码
sudo groupadd dev

4. 把用户加入组

bash 复制代码
sudo usermod -aG dev alice

注意:
-aG 中的 a 表示 append,追加到组。

如果少了 -a,可能会覆盖原来的附加组。


5. 查看用户所属组

bash 复制代码
groups alice

十六、常见实战场景

场景 1:让脚本可以执行

bash 复制代码
chmod +x deploy.sh
./deploy.sh

或:

bash 复制代码
bash deploy.sh

区别:

  • ./deploy.sh 需要执行权限
  • bash deploy.sh 不一定需要执行权限,但需要读权限

场景 2:设置 SSH 密钥权限

bash 复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys

推荐权限:

文件/目录 权限
~/.ssh 700
私钥 600
公钥 644
authorized_keys 600

场景 3:Web 目录权限

例如 Nginx 网站目录:

bash 复制代码
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 {} \;

含义:

  • 目录:755
  • 文件:644
  • 所属用户/组:www-data

场景 4:团队共享目录

bash 复制代码
sudo groupadd dev
sudo mkdir /project
sudo chown root:dev /project
sudo chmod 2775 /project
sudo usermod -aG dev alice
sudo usermod -aG dev bob

2775 中的 2 是 SGID,保证新建文件继承 dev 组。


十七、权限排查思路

当你遇到:

bash 复制代码
Permission denied

可以按这个顺序排查:

1. 看当前用户

bash 复制代码
whoami
id

2. 看文件权限

bash 复制代码
ls -l file

3. 看目录权限

bash 复制代码
ls -ld /path
ls -ld /path/to
ls -ld /path/to/dir

注意:

访问一个文件,不仅需要文件权限,还需要路径上每一级目录的 x 权限。

4. 看 ACL

bash 复制代码
getfacl file

5. 看是否需要 sudo

bash 复制代码
sudo command

6. 看服务用户

例如 Nginx、Apache、MySQL 访问文件失败时,要确认服务运行用户:

bash 复制代码
ps aux | grep nginx
ps aux | grep apache
ps aux | grep mysql

十八、权限管理最佳实践

推荐做法

  • 普通文件使用 644
  • 可执行脚本使用 755
  • 私钥使用 600
  • .ssh 目录使用 700
  • Web 目录通常目录 755、文件 644
  • 团队目录使用 2775 + 用户组
  • 使用 sudo 代替直接登录 root
  • 使用 visudo 修改 sudo 配置
  • 用 ACL 做细粒度授权

避免做法

  • 不要随意使用 chmod 777
  • 不要把敏感文件设为全局可读
  • 不要给未知程序设置 SUID
  • 不要直接编辑 /etc/sudoers
  • 不要让服务以 root 身份运行
  • 不要递归修改系统目录权限,例如:
bash 复制代码
chmod -R 777 /
chmod -R 777 /etc
chmod -R 777 /usr

这些操作可能导致系统损坏或严重安全风险。


十九、一句话总结

Linux 权限管理可以理解为:

谁,对什么文件或目录,能做什么操作。

核心公式是:

text 复制代码
用户身份 + 所属组 + 文件权限 + 目录权限 + ACL + 特殊权限 = 最终访问结果

如果你掌握了:

  • rwx
  • chmod
  • chown
  • chgrp
  • umask
  • SUID / SGID / Sticky Bit
  • ACL
  • sudo

就基本掌握了 Linux 权限管理的核心。

相关推荐
思麟呀2 小时前
Select多路转接
linux·网络·c++·网络协议·http
cen__y2 小时前
Linux04(重定向)
linux·服务器·c语言
senijusene3 小时前
I2C 总线框架下LM75A 温度传感器 Linux驱动开发:
linux·运维·驱动开发
专注VB编程开发20年3 小时前
工控成套控制柜厂家 / 自动化小工厂 对外市场价
运维·自动化·工控·上位机开发
片酷3 小时前
【Isaacsim&Isaaclab】安装教程
linux·开发语言·python
Magic@3 小时前
Redis学习[1] ——基本概念和数据类型
linux·开发语言·数据库·c++·redis·学习
microxiaoxiao3 小时前
Aeroshell:2026 年,支持AI的SSH 终端
运维·人工智能·ssh
大腕先生3 小时前
通用分页超详细介绍(附带源代码解析&页面展示效果)
xml·java·linux·服务器·开发语言·前端·idea
feng14563 小时前
稳定性-风险文化建设和风险意识培养
运维·人工智能