Linux - 权限的理解(深入浅出,详细细微)
大家好,这里是彩妙呀~
Linux权限是系统安全的基石,通过读(r)、写(w)、执行(x)三类权限,精准控制用户、用户组及其他用户对文件/目录的访问行为。权限以数字(如755)或符号(如u=rwx)表示,结合SUID、SGID、Sticky Bit等特殊权限,构建起多层级的保护机制。理解权限逻辑,不仅能避免“Permission denied”问题,更能从源头守护系统资源,是运维与开发的必修课。这里,彩妙将从底层原理一步步带着大家来学习本博客所讲述的内容:从shell基本原理出发->到怎样才能玩转权限。
目录
Shell命令以及运行原理
Linux权限的概念
Linux当中的用户
su命令
sudo命令
Linux权限管理
⽂件访问者的分类(⼈)
文件权限值的表示方法
字符表示法
8进制数值表示法
⽂件访问权限的相关设置⽅法
chmod命令
chown命令
chgrp命令
umask命令
Linux 目录权限与粘滞位详解
1. 目录权限的作用
可执行权限(x)
可读权限(r)
可写权限(w)
2. 粘滞位(Sticky Bit)的作用
3. 权限总结表
小结
Shell命令以及运行原理
Linux严格意义上说的是⼀个操作系统,我们称之为“核⼼(kernel)“ ,但我们⼀般⽤⼾,不能直接使⽤kernel。⽽是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。那为什么不能直接使用kernel呢?
[user1@hcss-ecs-d397 ~]$ ls -a -l
上面的代码就是一个命令行,下面我将带着大家逐一拆讲每一部分:
命令提示符部分: [user1@hcss-ecs-d397 ~]$
- user1:表示当前登录的用户名(也可以是root)
- hcss-ecs-d397:主机名或服务器名称(每一个主机都不一样,可以在root权限下使用hostname这个命令进行更改)
- ~:表示当前位于用户的家目录(home directory)(或者当前所在目录名)
- $:普通用户权限提示符(root用户会显示为#)
命令主体部分: ls -a -l 这是一个常见的Linux文件列表命令,包含:
- ls:list的缩写,基础命令用于列出目录内容
- -a:all选项,显示所有文件(包括隐藏文件,Linux中隐藏文件以.开头)
- -l:long listing format选项,以详细列表格式显示
而其中,输出的命令行并不是由操作系统所提供的功能,而是由一个外壳程序所给我们打印出来、操作的。
原理图是这样的:
从技术⻆度,上图所对应的操作,在Shell中,其最简单定义:命令⾏解释器(command Interpreter)主要包含:
- 将使⽤者的命令翻译给核⼼(kernel)处理。
- 同时,将核⼼的处理结果翻译给使⽤者。
对⽐windows GUI,我们操作 windows 不是直接操作windows内核,⽽是通过图形接⼝,点击,从⽽完成我们的操作(⽐如进⼊D盘的操作,我们通常是双击D盘盘符.或者运⾏起来⼀个应⽤序)。
shell 对于Linux,有相同的作⽤,主要是对我们的指令进⾏解析,解析指令给Linux内核。反馈结果在通过内核运⾏出结果,通过shell解析给⽤⼾。
总的来说,shell就是一个外壳程序。
Linux权限的概念
Linux当中的用户
在Linux中,用户分为两种用户:
-
超级⽤⼾:可以再linux系统下做任何事情,不受限制 。(root用户,在windows中是administer)
-
普通⽤⼾:在linux下做有限的事情。
PS:超级⽤⼾的命令提⽰符是“#”,普通⽤⼾的命令提⽰符是“$”。
我们可以使用 su 命令来从普通用户切换为超级用户:
su命令
命令:su [⽤⼾名]
功能:切换⽤⼾。
例如,要从root⽤⼾切换到普通⽤⼾user,则使⽤ su user。
要从普通⽤⼾user切换到root⽤⼾则使⽤ su root(root可以省略),此时系统会提⽰输⼊root⽤⼾的 ⼝令。
#su命令切换超级用户(root用户)时需要输入密码(密码是不显示的)。
#可以使用Ctrl + D 来切换用户#使用su来切换用户时,所处用户时不变的。
[user1@hcss-ecs-d397 ~]$ su
Password:
[root@hcss-ecs-d397 user1]# #使用su - 是以root身份重新登录一次,所以路径会发生改变。
[user1@hcss-ecs-d397 lession2]$ ls
ceshi ce_shi.txt other_zip text.c[user1@hcss-ecs-d397 lession2]$ su -
Password:
su: Authentication failure #密码输入错误,需要重新输入[user1@hcss-ecs-d397 lession2]$ su -
Password:
Last login: Tue Jul 29 18:30:12 CST 2025 on pts/0
Last failed login: Tue Jul 29 18:30:54 CST 2025 on pts/0
There were 2 failed login attempts since the last successful login.#使用Ctrl + D 时,会自动填充logout命令来退出当前用户
[root@hcss-ecs-d397 ~]# logout
[user1@hcss-ecs-d397 lession2]$
在Linux中,切换为超级用户(root)的主要作用是获得最高系统权限,以便执行需要管理员级别的操作。例如:
- 安装或卸载软件包。
- 修改系统配置文件(如/etc目录下的文件)。
- 管理用户账户和权限。
- 运行特权命令或服务。
这有助于系统维护和故障排除,但需谨慎使用,以避免安全风险或意外损坏系统。
通常建议通过
sudo
命令临时提升权限,而非长期保持root登录。需要注意的是:以root用户身份登录普通用户时,是不需要密码的。
所以,下面就要介绍 sudo命令。
sudo命令
命令:sudo [命令]
功能:短暂以root身份执行代码。
常用参数
参数 | 作用 | 示例 |
---|---|---|
-u | 指定目标用户 | sudo -u bob whoami |
-l | 列出当前用户可用命令 | sudo -l |
-i | 启动目标用户的 shell | sudo -i -u postgres |
-v | 刷新认证有效期 | sudo -v |
安全实践建议
- 避免直接使用
sudo su
或sudo -i
进入 root shell- 通过
visudo
命令编辑配置文件(语法检查防锁死)- 遵循最小权限原则,仅授权必要命令
⚠️ 警告:滥用
sudo
可能导致系统损坏,例如sudo rm -rf /
会彻底删除文件系统。
#查看现在登录的用户
[user1@hcss-ecs-d397 ceshi]$ whoami
user1
#user1没有权限执行sudo
[user1@hcss-ecs-d397 ceshi]$ sudo whoami
[sudo] password for user1:
user1 is not in the sudoers file. This incident will be reported.
#切换超级用户
[user1@hcss-ecs-d397 ceshi]$ su
Password:
#提权(修改文件)
[root@hcss-ecs-d397 ceshi]# vim /etc/sudoers
[root@hcss-ecs-d397 ceshi]# exit#再次执行命令
[user1@hcss-ecs-d397 ceshi]$ sudo whoami
[sudo] password for user1:
root #用户为root(端在提权)[user1@hcss-ecs-d397 ceshi]$
Linux权限管理
来观察下面的命令行:
#user1用户创建文件
[user1@hcss-ecs-d397 ceshi]$ touch user_file
[user1@hcss-ecs-d397 ceshi]$ ll
total 0
-rw-rw-r-- 1 user1 user1 0 Jul 29 18:41 user_file#root用户创建文件
[user1@hcss-ecs-d397 ceshi]$ su
Password:
[root@hcss-ecs-d397 ceshi]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 29 18:42 root_file
-rw-rw-r-- 1 user1 user1 0 Jul 29 18:41 user_file
我们会发现,创建文件后,文件的属性会出现相关内容:
-rw-r--r-- 1 root root 0 Jul 29 18:42 root_file
-rw-rw-r-- 1 user1 user1 0 Jul 29 18:41 user_file其中,第一个名字为文件所属人,第二个名字为文件所属组。
前面的字符串(-rw-r--r--)为权限字段,下面会详细解释。
所以,在访问文件时,分人
⽂件访问者的分类(⼈)
在文件访问者中,分为一下三类:
- ⽂件和⽂件⽬录的所有者:u---User(中国平⺠ 法律问题)
- ⽂件和⽂件⽬录的所有者所在的组的⽤⼾:g---Group(不多说)
- 其它⽤⼾:o---Others (外国⼈)
而文件对访问者的所开发一下三个基本权限:
- 读(r/4):Read对⽂件⽽⾔,具有读取⽂件内容的权限;对⽬录来说,具有浏览该⽬录信息的权限
- 写(w/2):Write对⽂件⽽⾔,具有修改⽂件内容的权限;对⽬录来说具有删除移动⽬录内⽂件的权限
- 执⾏(x/1):execute对⽂件⽽⾔,具有执⾏⽂件的权限;对⽬录来说,具有进⼊⽬录的权限
- “—”表⽰不具有该项权限
所以,在上一篇博客中,给大家介绍ls时,出现下面表格:
类型 | 所有者权限 | 组权限 | 其他权限 | 大小 | 日期 | 名称 |
---|---|---|---|---|---|---|
- | rw- | rw- | r-- | 827B | 07-19 19:49 | install.sh |
d | rwx | rwx | r-x | 4KB | 07-17 01:51 | lesson2 |
d | rwx | rwx | r-x | 4KB | 07-19 19:52 | lesson7 |
d | rwx | rwx | r-x | 4KB | 05-01 18:44 | mydir |
其中,可以非常清楚来看到所有人所拥有的权限。下面给大家介绍两个有关文件权限所表示的方法。
文件权限值的表示方法
文件权限在Linux系统中主要有两种表示方法:字符表示法和8进制数值表示法。
字符表示法
字符表示法使用10个字符来表示文件权限:
第1位表示文件类型(文件类型在Linux命令大全-从入门到精通中给大家做了解释)
后9位分为3组,每组3位,分别表示:
第1组:所有者(user)权限
第2组:所属组(group)权限
第3组:其他用户(other)权限
每组中的3位依次表示读(r)、写(w)、执行(x)权限,而无相应权限用-
表示
示例:
- rwx r-x r--
表示:
- 普通文件( - )
- 所有者有读、写、执行权限( rwx)
- 所属组有读、执行权限( r-x )
- 其他用户只有读权限( r-- )
8进制数值表示法
8进制数值表示法使用3位8进制数表示权限,每位8进制数对应一组权限(所有者、所属组、其他用户):
- 每个权限位对应一个数值:
- 读(r) = 4
- 写(w) = 2
- 执行(x) = 1
- 无权限 = 0
- 将每组的权限数值相加得到该组的8进制值
示例:
755
表示:- 所有者:4(r) + 2(w) + 1(x) = 7
- 所属组:4(r) + 0 + 1(x) = 5
- 其他用户:4(r) + 0 + 1(x) = 5
- 对应字符表示为
-rwxr-xr-x
常见权限设置:
644
:所有者读写,其他用户只读755
:所有者完全控制,其他用户读和执行777
:所有用户都有完全权限(不推荐使用)
那么,我们有该如何去修改用户所对应的权限呢?
⽂件访问权限的相关设置⽅法
chmod命令
功能:设置⽂件的访问权限
格式:chmod [参数] 权限 ⽂件名
常⽤选项:R -> 递归修改⽬录⽂件的权限
说明:只有⽂件的拥有者和root才可以改变⽂件的权限
chmod命令权限值的格式:
⽤⼾表⽰符+/-=权限字符
- +:向权限范围增加权限代号所表⽰的权限
- -:向权限范围取消权限代号所表⽰的权限
- =:向权限范围赋予权限代号所表⽰的权限
⽤⼾符号:
- u:拥有者
- g:拥有者同组⽤
- o:其它⽤⼾
- a:所有⽤⼾
代码示例:
#修改文件权限,将rwx权限都不赋予。
[root@hcss-ecs-d397 ceshi]# chmod a-rwx root_file
[root@hcss-ecs-d397 ceshi]# ll
total 0
---------- 1 root root 0 Jul 29 18:42 root_file
-rw-rw-r-- 1 user1 user1 0 Jul 29 18:41 user_file#修改文件,赋予其 rwx 权限给拥有者 ;rw权限给所属组 ; r权限给其他人。
[root@hcss-ecs-d397 ceshi]# chmod u+rwx root_file [root@hcss-ecs-d397 ceshi]# chmod o+r root_file [root@hcss-ecs-d397 ceshi]# chmod g+rw root_file [root@hcss-ecs-d397 ceshi]# ll
total 0
-rwxrw-r-- 1 root root 0 Jul 29 18:42 root_file
-rw-rw-r-- 1 user1 user1 0 Jul 29 18:41 user_file#使用三位8进制数字来修改文件权限
[root@hcss-ecs-d397 ceshi]# chmod 224 user_file [root@hcss-ecs-d397 ceshi]# ll
total 0
-rwxrw-r-- 1 root root 0 Jul 29 18:42 root_file
--w--w-r-- 1 user1 user1 0 Jul 29 18:41 user_file
chown命令
功能:修改文件所有者
格式:chown [选项] 用户名 文件名
示例:
chown user1 f1
chown -R user1 filegroup1
(递归修改整个目录组的所有者)
chgrp命令
功能:修改文件或目录所属组
格式:chgrp [选项] 用户组名 文件名
常用选项:
-R
递归修改文件或目录的所属组
示例:
chgrp users /abc/f2
umask命令
功能:
- 查看或修改文件权限掩码
- 设置新建文件的默认权限(0666)
- 设置新建目录的默认权限(0777)
实际创建的文件/目录权限会受umask值影响。计算方式为:默认权限 & ~umask
。
格式: umask [权限值]
说明:
- 通过默认权限减去权限掩码得到最终权限
- 超级用户默认掩码:0022
- 普通用户默认掩码:0002
示例:
umask 755
# 设置权限掩码umask
# 查看当前掩码umask 044
# 修改掩码值
Linux 目录权限与粘滞位详解
1. 目录权限的作用
Linux 中的目录权限决定了用户对目录及其内容的操作能力:
可执行权限(x)
功能:允许用户进入目录(cd
)或执行目录中的命令
关键限制:
若无 -x
权限,即使用户拥有 -r
权限,也无法进入目录
示例:可执行 ls -l /home/
查看内容,但 cd /home/
会失败
可读权限(r)
功能:允许用户查看目录中的文件列表(如 ls
)
关键限制:
若无 -r
权限,用户无法列出文件,但拥有 -x
权限时仍可通过已知路径操作文件(需文件权限支持)
可写权限(w)
功能:允许用户在目录中创建或删除文件/子目录
安全隐患:
任何用户都可删除目录中的文件,不论文件所有者是谁
示例:
[root@localhost ~]$ chmod 777 /home/
[root@localhost ~]$ touch /home/root.c
[litao@localhost ~]$ rm /home/root.c # 普通用户可删除root创建的文件
2. 粘滞位(Sticky Bit)的作用
为解决"目录写权限导致任意用户删除他人文件"的问题,Linux 引入了粘滞位机制。
-
功能:
设置后,目录中的文件仅允许以下用户删除或重命名:- 文件所有者
- 目录所有者
root
用户
-
设置方法
chmod +t /path/to/directory # 添加粘滞位 chmod -t /path/to/directory # 移除粘滞位
-
查看方法
执行ls -ld
查看目录权限:[root@localhost ~]$ ls -ld /home/ drwxrwxrwt. 3 root root 4096 9月19日16:00 /home/ # 权限末尾的't'表示粘滞位生效
-
效果验证
[root@localhost ~]$ chmod +t /home/ [litao@localhost ~]$ rm /home/abc.c rm: 无法删除"/home/abc.c": 不允许的操作
3. 权限总结表
权限 | 功能 | 注意事项 |
---|---|---|
可执行(x) | 允许进入目录或执行命令 | 无-x 权限时,即使有-r 也无法进入目录 |
可读(r) | 允许查看目录内容 | 无-r 权限时无法列出文件 |
可写(w) | 允许创建/删除文件 | 任何用户都可删除目录中的文件 |
粘滞位(t) | 限制文件删除权限 | 常用于公共目录防止误删 |
小结
Linux采用读(r)、写(w)、执行(x)三种基本权限来控制系统资源访问。这些权限分别作用于三类对象:
- 用户(u):文件所有者
- 组(g):所属用户组
- 其他(o):其他所有用户
主要权限管理命令包括:
chmod
:修改权限(支持数字模式755或符号模式u+rx)chown
:变更文件所有者chgrp
:修改文件所属组umask
:设置默认权限(如022对应文件默认权限644)
目录权限特点:
- 执行权限(x):允许进入目录(cd命令)
- 写权限(w):可创建/删除文件(需注意安全隐患)
- 粘滞位(Sticky Bit):通过
chmod +t
设置,限制只有文件所有者、目录所有者或root能删除文件(常用于/tmp等共享目录)
下一章将会讲解有关linux中一个工具的使用:vim,关注博主,获取更多优质好文吧。
我们下次再见啦