当前位置: 首页 > news >正文

Linux 深入理解权限

一.权限

1.权限是什么

结合生活实际,我们可以知道:权限是用来约束我们能做什么,不能做什么的东西。对于Linux来说,有着一切皆文件的思想,所以我们对权限的一切行为(修改)都会基于文件进行。根据上篇文章的文件权限,我们能得出一个重要结论:权限=角色+属性。

2.对权限的理解

既然权限=角色+属性,我们也可以进一步得出:权限约束角色的行为,并约束目标的特定属性。就好比:学校看门的保安,在你进校门时不会拦你,是因为你是学生这个角色,并不是因为你是什么特定的人;你不可能在leetcode上看电影,也不可能在某视频软件上写代码,因为这些目标本身不带有那些属性。接下来我们就谈谈在Linux中的角色与属性

3.Linux中的角色

总的来说,Linux中的角色大致可以分为三个:拥有者(user),所属组(group),其他(other)。我们新建一个目录来看看这个目录的角色分配。

mkdir filename

wujiahao@VM-12-14-ubuntu:~$ mkdir test
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/

由上篇文章的基础我们已经得知前面的信息代表着什么:1位表示文件类型+3位用户权限+3位所属组权限+3位其他权限。

1.拥有者

简单来说,拥有者就是当前目录的创建者,他们用有这个文件的生杀大权,同时也可以修改对其他用户的各种权限。

2.所属组

所属组的出现是对角色的更细化区分,举个例子:现在公司拟用赛马模式令两个不同的项目组完成同一个软件。那么可以假定老板是机器的拥有者,由A,B两组来完成这个项目:

由之前的讲解我们知道,每在一台机器上创建一个用户,对应的家目录就会出现相应的用户的目录

例如我自己的机器上的多个用户。

wujiahao@VM-12-14-ubuntu:~$ tree /home
/home
├── lesson2
│?? ├── mydir
│?? │?? ├── hello.txt
│?? │?? ├── nature.txt
│?? │?? ├── poet.txt
│?? │?? ├── test.c
│?? │?? └── test.i
│?? └── yourdir
├── lighthouse  [error opening dir]
├── ubuntu  [error opening dir]
├── wujiahao
│?? ├── gitcode
│?? │?? ├── file4
│?? │?? ├── file5
│?? │?? └── ReadMe
│?? └── test
└── wujiaqi  [error opening dir]

对于公司中的其他人,也可能在使用这个机器,但是对于这个项目而言,只需要你们AB两个组有相应的权限即可,其他人是无权干涉的。

那么这里的AB,就可以被称为是所属组

3.其他

对于这个项目而言,拥有者是老板,所属组为AB,那么其他的与项目无关的员工就是其他

4.用户的权限

用户可以被分为root(超级用户)和普通用户。root拥有在系统中的最高权限——只有你想不到没有他做不到。而用户的权限,可以说是实现了Linux多用户系统隔离性的重要机制。

我们不妨查看家目录下的各个用户

ll

wujiahao@VM-12-14-ubuntu:/home$ ll
total 28
drwxr-xr-x  7 root       root       4096 Sep 10 09:22 ./
drwxr-xr-x 20 root       root       4096 Sep 12 16:06 ../
drwxr-xr-x  3 root       root       4096 Sep  9 20:33 lesson2/
drwxr-x---  2 lighthouse lighthouse 4096 Sep  7 20:53 lighthouse/
drwxr-x---  4 ubuntu     ubuntu     4096 Sep  7 20:53 ubuntu/
drwxr-x---  5 wujiahao   wujiahao   4096 Sep 12 15:47 wujiahao/
drwxr-x---  3 wujiaqi    wujiaqi    4096 Sep 10 09:55 wujiaqi/

看看wujiahao和wujiaqi两个用户,他们的权限都只对拥有者开放rwx,所属组开放rx,其他用户全部屏蔽。那么作为wujiahao的我想去访问wujiaqi的家目录:

wujiahao@VM-12-14-ubuntu:/home$ whoami
wujiahao
wujiahao@VM-12-14-ubuntu:/home$ cd /home/wujiaqi
-bash: cd: /home/wujiaqi: Permission denied

就会被拒绝,也就是说:每创建一个用户,家目录中就会出现对应的目录,而用户各自的家目录相对于其他用户都是被隔离的。

那么,对于这种隔离,是不是绝对的铁律呢?

实际上也并不是,root用户可以访问任意用户的家目录。

root@VM-12-14-ubuntu:~# pwd
/root
root@VM-12-14-ubuntu:~# whoami
root
root@VM-12-14-ubuntu:~# cd /home/wujiaqi
root@VM-12-14-ubuntu:/home/wujiaqi# pwd
/home/wujiaqi

没错,root用户就是可以这么为所欲为,不仅可以进入其他普通用户家目录,而且可以在他们各自的目录下创建删除目录,甚至可以直接把这个普通用户删掉。

5.sudo与权限

实际上,用户和用户之间的壁垒也并不是绝对的。普通用户可以通过执行sudo命令完成暂时的提权来获得root的权限,如下:

wujiahao@VM-12-14-ubuntu:/home$ sudo cd /home/wujiaqi
[sudo] password for wujiahao: 

在普通用户的账号下,sudo指令最常用的是我们安装某些指令。

wujiahao@VM-12-14-ubuntu:/home$ sudo apt install zip
[sudo] password for wujiahao: 

那么现在有个很大的问题

问题:用户之间能通过sudo提权跨过壁垒,root用户能随意执行各种指令,Linux的权限到底还有什么意义?

不急,其实这反而能体现Linux的多用户精髓所在。虽然sudo能让普通用户暂时获得最高权限,但是你不妨想一想,是所有人都能用sudo指令吗?

wujiahao@VM-12-14-ubuntu:/home$ sudo cd /home/wujiaqi
[sudo] password for wujiahao: 
wujiahao is not in the sudoers file.  This incident will be reported.

作为普通用户的我试图通过sudo去访问其他用户的家目录,结果出现这些提示:我不在sudoers这个文件中。sudoers文件,实际上就是我们常说到的白名单。这里我们用root进入sudoers一探究竟

这个白名单上,压根就没有任何人的用户名——也就是说,当前这台机器,没有任何人能执行sudo指令。再来回头看看sudoers文件的属性:

drwxr-x---   2 root root       4096 Sep  7 20:52 sudoers.d/

它的拥有者和所属组都是root,并且不允许其他用户有任何权限。也就是说:要执行sudo——当前用户需要在白名单——白名单只有root有权限进行修改。也就是说,实际上依然是root掌管一切,其他用户只有经过root的同意才能将名字留在sudoers上。

6.Linux中的属性

1.权限一览

1.说完角色,我们再来谈谈属性。

上文反复提到rwx,那么他们到底是什么东西?

r(read):可读权限

w(write):可写权限

x(execute):可执行权限

wujiahao@VM-12-14-ubuntu:/home$ ll
total 28
drwxr-xr-x  7 root       root       4096 Sep 10 09:22 ./
drwxr-xr-x 20 root       root       4096 Sep 12 16:31 ../
drwxr-xr-x  3 root       root       4096 Sep  9 20:33 lesson2/
drwxr-x---  2 lighthouse lighthouse 4096 Sep  7 20:53 lighthouse/
drwxr-x---  4 ubuntu     ubuntu     4096 Sep  7 20:53 ubuntu/
drwxr-x---  5 wujiahao   wujiahao   4096 Sep 12 15:47 wujiahao/
drwxr-x---  3 wujiaqi    wujiaqi    4096 Sep 10 09:55 wujiaqi/

作为文件的拥有者,我们可以任意修改各个角色对该文件的权限。例如:先创建一个文件my.txt

wujiahao@VM-12-14-ubuntu:~$ touch my.txt
wujiahao@VM-12-14-ubuntu:~$ ls
gitcode  my.txt  test
wujiahao@VM-12-14-ubuntu:~$ ll
total 56
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 16:38 ./
drwxr-xr-x 7 root     root     4096 Sep 10 09:22 ../
-rw------- 1 wujiahao wujiahao 4960 Sep 12 16:38 .bash_history
-rw-r--r-- 1 wujiahao wujiahao  220 Sep  8 18:51 .bash_logout
-rw-r--r-- 1 wujiahao wujiahao 3771 Sep  8 18:51 .bashrc
drwx------ 2 wujiahao wujiahao 4096 Sep  8 20:21 .cache/
drwxrwxr-x 3 wujiahao wujiahao 4096 Sep 11 20:15 gitcode/
-rw------- 1 wujiahao wujiahao   20 Sep 11 20:19 .lesshst
-rw-rw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt
-rw-r--r-- 1 wujiahao wujiahao  807 Sep  8 18:51 .profile
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
-rw------- 1 wujiahao wujiahao 4994 Sep 11 20:15 .viminfo
-rw------- 1 wujiahao wujiahao  183 Sep 12 15:32 .Xauthority

接着修改my.txt的权限

chmod u/g/o +/- rwx

----rw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt

再试着访问my.txt

vim my.txt

发现已经被拒绝。

2.目录的权限

进入/退出目录需要x权限,那么rw对目录意味着什么?

r:没有r无法看到目录中的文件 ,但可以在目录中创建文件

w:如果没有w无法在指定目录中创建文件

wujiahao@VM-12-14-ubuntu:~$ ll
total 64
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 16:55 ./
drwxr-xr-x 7 root     root     4096 Sep 10 09:22 ../
-rw------- 1 wujiahao wujiahao 5365 Sep 12 16:58 .bash_history
-rw-r--r-- 1 wujiahao wujiahao  220 Sep  8 18:51 .bash_logout
-rw-r--r-- 1 wujiahao wujiahao 3771 Sep  8 18:51 .bashrc
drwx------ 2 wujiahao wujiahao 4096 Sep  8 20:21 .cache/
drwxrwxr-x 3 wujiahao wujiahao 4096 Sep 11 20:15 gitcode/
-rw------- 1 wujiahao wujiahao   20 Sep 11 20:19 .lesshst
--wxrw-r-- 1 wujiahao wujiahao   23 Sep 12 16:55 my.txt*
-rw-r--r-- 1 wujiahao wujiahao  807 Sep  8 18:51 .profile
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
-rw------- 1 wujiahao wujiahao 8591 Sep 12 16:49 .viminfo
-rw------- 1 wujiahao wujiahao  183 Sep 12 15:32 .Xauthority
wujiahao@VM-12-14-ubuntu:~$ chmod u-x gitcode
wujiahao@VM-12-14-ubuntu:~$ cd ./gitcode
-bash: cd: ./gitcode: Permission denied

可以看到,我们去掉x权限,是无法进入目录的。

2.重要问题解释

接着来谈几个问题

问题1:能修改其他人的文件的权限吗?

回答1:不能,用户只能修改自己的文件的权限

如下测试,用户只能修改拥有者为自己的文件,试图修改其他用户的文件会直接被拒绝

wujiahao@VM-12-14-ubuntu:~$ cd /home/lesson2
wujiahao@VM-12-14-ubuntu:/home/lesson2$ ll
total 12
drwxr-xr-x 3 root root 4096 Sep  9 20:33 ./
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ../
drwxr-xr-x 2 root root 4096 Sep 10 09:37 mydir/
-rw-r--r-- 1 root root    0 Sep  9 20:34 yourdir
wujiahao@VM-12-14-ubuntu:/home/lesson2$ chmod u-r mydir
chmod: changing permissions of 'mydir': Operation not permitted

问题2:当拥有者本人没有某项权限,但所属组包含拥有者,且有这个权限,会发生什么?

回答2:Linux中想要对文件进行操作,首先会确认你是什么角色;既然确定了你是拥有者,并且没有该权限,那你便无权访问,而不会进行再次匹配角色。

例如我们这里以wujiahao身份创建了my.txt,并修改了拥有者的read权限。

wujiahao@VM-12-14-ubuntu:~$ chmod u-r my.txt
--wxrw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt*
wujiahao@VM-12-14-ubuntu:~$ vim my.txt

此时会发现即使所属组包含wujiahao且有read权限,但在匹配角色时只会匹配一次,read操作被拒绝。

问题3:root用户的权限真的无限吗?

回答3:是的,不要用你有限的认知挑战root无限的权限

不管是进入家目录,打开my.txt,修改my.txt,都如入无人之境。。。

root@VM-12-14-ubuntu:/home/wujiahao# whoami
root
root@VM-12-14-ubuntu:/home/lesson2/mydir# cd /home/wujiahao
root@VM-12-14-ubuntu:/home/wujiahao# ll
--wxrw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt*
root@VM-12-14-ubuntu:/home/wujiahao# vim my.txt
root@VM-12-14-ubuntu:/home/wujiahao# cat my.txt
I am root
I am supreme

问题4:如何理解x(可执行)权限?

回答4:可执行权限!=文件可以执行

我们知道,要进入目录首先需要x权限。而对于可执行文件(编译之后的c程序文件)可执行权限才有意义,如果一个文件没有可执行的属性(如普通文本文件),即使有可执行权限x也没有太大意义。

问题5:有了属性更改的指令chmod,有没有角色更改的指令?

回答5:有,叫做chown/chgrp,用于修改当前目录的拥有者或所属组

需要注意的是,操作系统默认不支持更改拥有者或所属组(有点甩锅的意思。。),需要更高权限(sudo或root用户)才能执行这个指令。

7.权限表示法——八进制表示法

八进制表示法是一种更简洁、常用于命令设置权限的方法。它将每一组权限(rwx)视为一个二进制数,然后转换为一个八进制数字。

计算原理:
每个权限都有一个固定的数值:

  • r (读) = 4

  • w (写) = 2

  • x (执行) = 1

  • - (无权限) = 0

要计算一组的权限数字,只需将其有权限的值相加即可。

权限组合计算过程八进制数字
---0 + 0 + 00
--x0 + 0 + 11
-w-0 + 2 + 02
-wx0 + 2 + 13
r--4 + 0 + 04
r-x4 + 0 + 15
rw-4 + 2 + 06
rwx4 + 2 + 17

格式:
整个文件的权限由三个八进制数字表示,分别对应所有者所属组其他用户

[所有者权限数字][所属组权限数字][其他用户权限数字]

示例:

# 将 file.txt 的权限设置为 644 (rw-r--r--)
chmod 644 file.txt# 将 script.sh 的权限设置为 755 (rwxr-xr-x),使其可执行
chmod 755 script.sh# 将目录 mydir 及其内部所有内容权限设置为 700 (rwx------)
chmod -R 700 mydir
# -R 选项表示递归操作

8.缺省权限与umask

1. 什么是缺省权限?

当你在 Linux 中创建一个新的文件或目录时,系统并不会给它分配 777 (rwxrwxrwx) 或 666 (rw-rw-rw-) 这样宽松的权限,而是会遵循一个更安全、更合理的原则。这个系统自动赋予的初始权限,就叫做缺省权限(Default Permissions)。

系统有一个预定义的最大权限,但会用一个叫做 umask 的值来“削减”这个最大权限,从而得到最终的缺省权限。

  • 文件的最大初始权限是 666 (rw-rw-rw-),即没有执行(x)权限。这是出于安全考虑,防止新创建的文件自动拥有可执行权限。

  • 目录的最大初始权限是 777 (rwxrwxrwx),因为目录需要可执行(x)权限才能被进入和访问。


2. 什么是 umask?

umask(用户文件创建掩码)是一个用于控制缺省权限的机制。它是一个四位的八进制数字(通常第一位是特殊权限位,常为0,所以通常我们看到的是后三位),它定义了创建新文件或目录时需要从最大权限中移除(屏蔽掉)的权限

你可以把它理解为一个“权限过滤器”或“遮罩”。系统用最大权限减去 umask 值,就得到了实际的缺省权限。

查看当前 umask 值:
使用 umask 命令即可。

$ umask
0002
# 或者
$ umask -S
u=rwx,g=rwx,o=rx
# 符号表示法,显示了最终用户拥有的权限,而不是掩码本身

最终权限计算=起始权限 & (~umask)

3. 如何设置和修改 umask?

umask 值可以在以下几个级别设置:

a. 临时修改 (对当前Shell会话有效)

直接在终端中输入 umask 命令加上新的值。

# 将 umask 设置为 077 (非常严格,仅用户自己可读写)
umask 077# 验证
umask
# 输出:0077# 之后创建的新文件权限将是 600 (rw-------)
# 之后创建的新目录权限将是 700 (rwx------)
b. 永久修改 (对用户生效)

将 umask 命令添加到用户的 shell 配置文件中,这样每次登录都会自动设置。

  • 对于 Bash 用户,编辑 ~/.bashrc 文件。

  • 对于 Zsh 用户,编辑 ~/.zshrc 文件。

在文件末尾添加一行,例如:

# 设置 umask 为 002,便于组协作
umask 002

然后运行 source ~/.bashrc(或 source ~/.zshrc)使更改立即生效,或者重新打开终端。

c. 系统全局修改 (不推荐轻易修改)

可以修改 /etc/profile 或 /etc/bash.bashrc 这样的全局配置文件来为所有用户设置默认 umask。但这会影响整个系统,需要谨慎操作。


文章转载自:

http://FDM2peHY.rgkcf.cn
http://jO6tYmlv.rgkcf.cn
http://I0uQvCHz.rgkcf.cn
http://DL7wfbMc.rgkcf.cn
http://ei3NhW4h.rgkcf.cn
http://JCp6l2Gq.rgkcf.cn
http://1GnOKTsq.rgkcf.cn
http://c9yJtTbm.rgkcf.cn
http://coYWytt0.rgkcf.cn
http://Ry2IUeli.rgkcf.cn
http://Bp6xhnLt.rgkcf.cn
http://728trQo8.rgkcf.cn
http://19JiubJo.rgkcf.cn
http://oBA0cY8v.rgkcf.cn
http://172oHy9f.rgkcf.cn
http://6TI4vPZd.rgkcf.cn
http://WXfr8PPz.rgkcf.cn
http://pivmP1tl.rgkcf.cn
http://m1LBwlNq.rgkcf.cn
http://BxHJqF9f.rgkcf.cn
http://qyfZOV7D.rgkcf.cn
http://ODseGomg.rgkcf.cn
http://vDjUvvVp.rgkcf.cn
http://a2UixDsC.rgkcf.cn
http://ABK52Ifc.rgkcf.cn
http://KMdiTfur.rgkcf.cn
http://cHle2kSR.rgkcf.cn
http://8rYvlCXe.rgkcf.cn
http://V2jsZf7j.rgkcf.cn
http://U7xhZ5KZ.rgkcf.cn
http://www.dtcms.com/a/380043.html

相关文章:

  • SQL Server 中的 STUFF 函数与FOR XML PATH详解
  • 配置自签证书多域名的动态网站+部署http的repo仓库+基于nfs与yum仓库的http部署
  • React学习教程,从入门到精通,React AJAX 语法知识点与案例详解(18)
  • Go语言详细指南:特点、应用场景与开发工具
  • vue el-cascader级联选择器-地区三级选择问题记录
  • 《机器人抓取:从经典到现代的综述》内容的提取和凝练:
  • 【ZEGO即构开发者日报】微信公众号上线“智能回复”功能;2025年8月中国应用/游戏厂商出海收入Top30榜;土耳其宣布将封禁29款社交/社媒应用……
  • qt QAreaLegendMarker详解
  • #C语言——刷题攻略:牛客编程入门训练(十三):循环输出图形(二)、一维数组(一),轻松拿捏!
  • Nginx服务——安装与搭建
  • 远程真机调试支持网络多线路切换,让自助兼容性测试更流畅
  • AI Agent工作流实用手册:5种常见模式的实现与应用,助力生产环境稳定性
  • 前端渲染技术全解析:SSR、SSG、CSR 有什么区别?
  • html css js网页制作成品——HTML+CSS娃娃店网页设计(4页)附源码
  • mac本地安装mysql
  • 使用android studio分析cpu开销
  • Android Studio如何开启离线编译模式
  • CSS 动画实战:实现电商中“加入购物车”的抛物线效果
  • Terraform整合到GitLab+Jenkins工具链
  • android studio 断点无效
  • Prompt技术深度解析:从基础原理到前沿应用的全面指南
  • WPF报错 XDG000 Windows Presentation Foundation (WPF) 项目中不支持 Application
  • Docker的使用及核心命令
  • Jmeter测试
  • 神经网络基本概念
  • 【打包app】uniapp打包ios端和安卓端app
  • 【LeetCode 每日一题】3000. 对角线最长的矩形的面积
  • 制造业档案管理混乱:档案宝如何破解?
  • 第4周 数组的概念和常见操作
  • vue,uniapp 实现卷帘对比效果