这次学习Linux权限管理
权限并不只影响文件能否打开,也会影响目录能否进入、脚本能否执行、服务能否读取配置,以及多人共用目录时能否删除彼此的文件
Shell是用户与内核(Kernel)中间层
Linux严格意义上讲是一个操作系统的核心(Kernel),但一般用户不能直接使用Kernel,而是通过Kernel的“外壳”程序,即Shell,与Kernel进行通信
用户输入命令
|
Shell解析命令
|
Kernel执行系统调用
|
文件、进程、网络和硬件
Shell会解析命令、启动程序并展示结果,权限检查主要发生在内核处理文件、目录和进程请求的过程中,所以同一条命令由不同用户执行,结果可能不同
用户身份和命令提示符
Linux中常见的是普通用户和root用户,root拥有很高的管理权限,普通用户只能在被授予的范围内操作
终端提示符通常也能提示当前身份:
- 普通用户常见提示符是
$ - root用户常见提示符是
#
先用下面两条命令确认当前身份和所属组:
whoami
id
whoami只显示当前用户名,id还会显示用户ID、主组和附加组,判断权限问题时,组信息经常是关键线索
切换用户时可以使用su或sudo:
su - user
sudo -u user command
| 写法 | 作用 |
|---|---|
su - user |
切换到user,并按登录用户的方式加载其环境 |
sudo -u user command |
以user的身份执行一条命令 |
-不是每条命令都有的固定参数,它的具体作用取决于命令本身,遇到不确定的写法,可以运行man 命令名查看手册
用ls -l查看权限
ls -l会以详细列表显示文件信息,例如:
-rw-r----- 1 user dev 128 Aug 27 20:00 note.txt
第一位表示文件类型,后面的九位每三位一组,依次对应文件所有者、所属组和其他用户的权限
| 第一位 | 类型 |
|---|---|
- |
普通文件 |
d |
目录 |
l |
软链接 |
c |
字符设备 |
b |
块设备 |
p |
管道 |
s |
套接字 |
上例中的rw-r-----可以拆成三组:
| 用户范围 | 权限 | 含义 |
|---|---|---|
所有者u |
rw- |
可以读和写 |
所属组g |
r-- |
只能读 |
其他用户o |
--- |
没有权限 |
ls -l里的-l表示详细列表格式,ls -a里的-a表示显示隐藏文件,所以ls -la会同时显示详细信息和隐藏文件
文件和目录里的rwx
r、w和x在文件与目录上有不同含义
| 权限 | 对普通文件 | 对目录 |
|---|---|---|
r |
读取文件内容 | 列出目录中的名称 |
w |
修改文件内容 | 配合x创建、删除或重命名目录项 |
x |
执行文件 | 进入目录,并访问已知名称的目录项 |
目录的x很重要,没有x时,即使知道文件名,也无法正常进入目录或访问其中的文件
八进制权限值
每种基本权限都有对应数值:
| 权限 | 数值 |
|---|---|
r |
4 |
w |
2 |
x |
1 |
把同一类用户的权限数值相加,就能得到一个八进制位:
| 数值 | 权限 |
|---|---|
| 7 | rwx |
| 6 | rw- |
| 5 | r-x |
| 4 | r-- |
| 0 | --- |
例如755表示所有者拥有rwx权限,所属组和其他用户拥有r-x权限,640表示所有者可以读写,所属组只能读,其他用户没有权限
用chmod修改访问权限
chmod用于修改文件或目录的访问权限,常见写法有符号方式和数字方式
chmod u+x deploy.sh
chmod go-w config.env
chmod a=r readme.txt
chmod 640 config.env
符号方式可以拆成三部分:用户范围、操作符和权限
| 部分 | 可用值 | 作用 |
|---|---|---|
| 用户范围 | u、g、o、a |
所有者、所属组、其他用户、全部用户 |
| 操作符 | +、-、= |
增加、移除、精确设置权限 |
| 权限 | r、w、x |
读、写、执行 |
chmod u+x deploy.sh表示给所有者增加执行权限,chmod go-w config.env表示移除所属组和其他用户的写权限
数字方式适合一次明确写出三组权限,例如chmod 640 config.env
如果确实需要递归处理目录,可以使用-R:
chmod -R u=rwX,go=rX site/
| 写法 | 作用 |
|---|---|
-R |
递归处理指定目录及其内容 |
X |
只给目录和原本已经可执行的文件添加执行权限 |
大写X比直接使用x更适合批量处理目录,它不会把普通文本文件误设为可执行,递归修改前应先在测试目录中查看结果,避免影响大量文件
所有者和所属组
除了权限位,文件的所有者和所属组也会影响访问结果,chown修改所有者,chgrp修改所属组
sudo chown user:dev note.txt
sudo chgrp dev note.txt
sudo chown -R user:dev project/
| 写法 | 作用 |
|---|---|
sudo |
以已获授权的高权限身份执行命令 |
user:dev |
把所有者设为user,所属组设为dev |
-R |
递归处理目录和目录中的内容 |
修改所有者通常需要管理员权限,执行前应先用ls -l确认当前所有者和所属组,避免把服务文件交给错误的用户
umask决定新文件的默认权限
新建普通文件通常以666作为权限上限,新建目录通常以777作为权限上限,普通文件默认没有x,避免新建的文本文件直接具备执行权限
umask是创建对象时要屏蔽的权限位,可以先查看当前值:
umask
umask 022
| 掩码 | 新建普通文件 | 新建目录 |
|---|---|---|
022 |
644 |
755 |
002 |
664 |
775 |
可以把它理解为创建权限上限与掩码进行按位处理,022会移除所属组和其他用户的写权限,因此常见结果是文件644和目录755
目录权限和粘滞位
目录中的r、w和x决定能否查看名称、创建或删除条目、进入目录,很多“文件权限看起来没问题却无法访问”的情况,原因在于上级目录缺少x
共享目录还需要考虑删除权限,给目录设置粘滞位后,目录中的文件通常只能由文件所有者、目录所有者或root删除和重命名
mkdir -p permission-lab/share
chmod 1777 permission-lab/share
ls -ld permission-lab/share
| 写法 | 作用 |
|---|---|
mkdir -p |
上级目录不存在时一并创建,目标目录已存在时不报错 |
1777 |
首位1表示粘滞位,后面的777表示所有用户都有读、写、执行权限 |
ls -ld |
-l显示详细信息,-d显示目录本身而不列出其内容 |
/tmp就是常见的粘滞位目录,它允许多个用户创建临时文件,同时限制用户随意删除其他人的文件
小练习
可以在自己的工作目录中创建一个小实验,不需要改动系统目录:
mkdir -p permission-lab
touch permission-lab/private.txt
chmod 640 permission-lab/private.txt
mkdir permission-lab/upload
chmod 1777 permission-lab/upload
ls -ld permission-lab permission-lab/upload
ls -l permission-lab/private.txt
这个练习会创建一个仅供所有者读写的文件,以及一个带粘滞位的共享目录,查看ls -l输出时,重点观察权限字符、所有者、所属组和目录末尾的t
小结
Linux权限管理围绕用户身份、所属组、文件类型和rwx权限展开,chmod负责修改权限位,chown和chgrp负责调整所有者与所属组,umask影响新建对象的默认权限,粘滞位解决共享目录中的删除控制问题
遇到权限问题时,可以按顺序检查当前用户、文件所有者、所属组、权限位和上级目录的x权限,把这些信息拆开看,排查会更直接
来源
本文为个人学习笔记,根据lvy-的《深入解析Linux权限管理:从基本原理到应用》提炼并重新组织,保留原文链接供进一步阅读
留言
评论区暂未开放;可先通过 RSS 或「关于」页联系。