【Linux 系统篇(四)】权限详解(一)

【Linux 系统篇(四)】权限详解(一)

大家好,欢迎来到 huangjin007_ 的博客
个人主页:huangjin007_
🔥文章收录专栏:Linux 内功修炼手册(系统篇)
总会有一些坚持
能从冰封的土地里
培育出十万朵怒放的蔷薇

Linux 系统篇(四) —— 权限详解(一)

文章目录

  • Linux 系统篇(四) —— 权限详解(一)
    • 一、Linux 的用户体系
      • 1. 超级用户 vs 普通用户
      • 2. su 命令
      • 3. 临时借用管理员权限:sudo
        • 3.1 谁可以用 sudo?
    • 二、权限的本质:角色 + 目标属性
      • 1. 三种角色(访问者分类)
      • 2. 权限字符串:`ls -l`
      • 3. 基本权限:r、w、x 的含义
    • 三、修改权限和归属
      • 1. chmod:修改文件的访问权限
        • (1)字符法
        • (2)数字法
      • 2. chown:修改文件的拥有者
      • 3. chgrp:修改文件的所属组
    • 四、目录权限的三个灵魂问题
      • 问题 1:目录的 r、w、x 到底管什么?
      • 问题 2:能不能只给人“进入目录”的能力?
      • 问题 3:为什么普通用户能删掉别人的文件?
    • 结语:

一、Linux 的用户体系

我们常说“权限管理”,首先要清楚的是:系统里到底有哪些人?
Linux 的权限,本质上就是不同身份的人,对不同文件(或目录)能做不同的事情。

1. 超级用户 vs 普通用户

Linux 下的用户分为两种:

  • 超级用户(root)
    它对系统拥有绝对控制权,可以读取、修改、删除任何文件,甚至可以关机、重启、卸载软件等,一切操作几乎不受限制。
  • 普通用户
    由 root 创建,普通用户只能在自己有权限的范围内活动,无法随意修改系统关键目录(比如/etc/usr/bin),否则终端会报错:Permission denied(权限不足)。

怎么看当前是谁?看提示符。

  • 如果命令行前面的符号是#,说明当前是root 用户

  • 如果命令行前面的符号是$,说明当前是普通用户


2. su 命令

很多时候我们会需要在普通用户和 root 之间来回切换,就用su(switch user)。

命令格式:

su[用户名]
  • 从 root 切换到普通用户

    因为 root 是最高权限,降级到普通用户时不需要输入密码

  • 从普通用户切换到 root

    这时系统会提示输入 root 的密码。输入正确才能切换成功。

一个小坑:susu -有什么区别?

  • su root只切换用户身份,但环境变量还是原来普通用户的,可能会因为找不到命令而带来麻烦。
  • su -或者su - root不但切换用户,还会加载 root 的环境变量。
    同理,从 root 切换到普通用户时,也可以使用su - 用户名来完整加载该用户的环境。

3. 临时借用管理员权限:sudo

每次要用 root 权限都切到 root 用户,不但麻烦,而且长时间保持 root 状态操作系统也危险。所以 Linux 提供了一个更灵活的工具:sudo

sudo的全称是 Super User DO,意思是“以超级用户身份做某事”。
你不必完全变成 root,但可以让某一条命令临时拥有 root 的权限。

比如普通用户安装软件:

sudoaptinstallvim

输入当前用户的密码(注意不是 root 密码),系统确认该用户有 sudo 权限后,就会以 root 身份执行这条命令。

3.1 谁可以用 sudo?

不是每个普通用户都能直接用 sudo,必须由管理员事先授权。授权配置文件在/etc/sudoers

一个典型的授权行如下:

意思是用户whb可以在任何主机上以任何身份执行任何命令,即拥有完全 sudo 权限。

如果未授权的用户尝试用 sudo,会收到报错:

whb is not in the sudoers file. This incident will be reported.

二、权限的本质:角色 + 目标属性

Linux 权限设计可以用一句话概括:

谁(Who),对什么(What),能做什么(How)?

这就是权限的“人—事物—能力”模型。

1. 三种角色(访问者分类)

对于任何一个文件或目录,Linux 会把可能接触它的人分成三类:

  • 拥有者(Owner,用u表示)
    通常是创建文件的那个人。拥有者对该文件有最高的话语权(除了 root 可以无视一切)。

  • 所属组(Group,用g表示)
    把文件归属到一个用户组,组里所有成员共享对该文件的同一套权限。比如一个项目组的同事都需要读写某个共享文件,就会把他们放入同一个用户组。

  • 其他人(Others,用o表示)
    既不是拥有者,也不在所属组里的其他用户。系统和外界“访客”通常就落在这类。

重要特性:三类角色是互斥的。
系统在判断权限时,会按拥有者 -> 所属组 -> 其他人的顺序检查,只要匹配到其中一个身份,就直接使用对应的权限,不再往后看。


2. 权限字符串:ls -l

当我们执行ls -l查看文件时,最左侧会看到一串类似-rw-rw-r--的符号,一共 10 个字符。

我们拆解-rw-rw-r--这个字符串:

位序含义
第 1 位文件类型-表示普通文件
第 2~4 位拥有者(u)的权限rw-读、写、不可执行
第 5~7 位所属组(g)的权限rw-读、写、不可执行
第 8~10 位其他人(o)的权限r--只读

第 1 位的常见符号:

  • -:普通文件(文本、图片、可执行程序等)
  • d:目录(文件夹)
  • l:软链接(类似 Windows 快捷方式)
  • b:块设备文件(如硬盘、U 盘)
  • c:字符设备文件(如键盘、鼠标、终端)
  • p:管道文件(用于进程间通信)

3. 基本权限:r、w、x 的含义

每个角色都能获得三种基本权限的组合:

  • r(读,Read)
  • 对文件:可以查看文件内容(用catmore等)。
  • 对目录:可以列出目录下有哪些文件(用ls)。
  • w(写,Write)
  • 对文件:可以修改文件内容(用vimecho >等)。
  • 对目录:可以在目录下创建、删除、重命名文件(touchrmmv等)。
  • x(执行,eXecute)
  • 对文件:可以把文件当作程序运行。
  • 对目录:可以“进入”该目录(用cd)。

如果某个位置是-,就表示没有该项权限

八进制数值表示法:

每一组权限(u/g/o)的 rwx 如果存在看成 1,是-就看成 0。

rwx-> 111 = 7
rw--> 110 = 6
r-x-> 101 = 5
r---> 100 = 4

所以整个文件权限可以简洁地用三个数字表示,如 755、644 等。

例如-rwxr-xr--的数值表示就是 754:

拥有者:rwx= 7
所属组:r-x= 5
其他人:r--= 4


三、修改权限和归属

1. chmod:修改文件的访问权限

chmod(change mode)就是用来设置文件或目录权限的命令。

格式:

chmod[选项]权限 文件名

谁可以改?

  • 文件拥有者root可以改权限,其他人不行。

权限的表达方式有两种:字符法数字法

(1)字符法

格式为:[用户符号][操作符][权限字符]

用户符号:

  • u:拥有者
  • g:所属组
  • o:其他人
  • a:所有人(all,相当于 ugo 一起)

操作符:

  • +:增加某个权限
  • -:去掉某个权限
  • =:强制设置为某个权限(会覆盖之前的)


(2)数字法

用三个八进制数字分别代表 u、g、o 的权限。


2. chown:修改文件的拥有者

chown(change owner)用来更换文件的主人。

格式:

chown[选项]新用户名 文件名

注意:这个操作是管理员的专属权力。
普通用户不能把文件的所有权交给别人,这是系统安全设计。如果普通用户执行chown,会提示Operation not permitted
若确实需要,必须配合sudo提权:

sudochownuser1 f1

3. chgrp:修改文件的所属组

chgrp(change group)用来修改文件属于哪个用户组。

格式:

chgrp[选项]组名 文件名

同样,修改组也可能需要相应权限,通常文件拥有者可以把自己的文件改到一个他所属的组,但跨组改动往往也需要sudo


四、目录权限的三个灵魂问题

很多容易把“目录的权限”和“文件的权限”混为一谈。下面三个问题帮你彻底拔掉这个钉子。

问题 1:目录的 r、w、x 到底管什么?

权限对目录的意义对应的能力
r可以读取目录的内容列表能执行ls查看目录下有哪些文件名
w可以修改目录的内容能在目录下创建、删除、重命名文件(touchrmmv
x可以进入目录cd进入该目录,作为当前工作目录

很明显,对于目录来说,x 权限是基础。如果一个目录你没有 x 权限,就算它有 r 权限,你也无法进入,完全拿它没办法。



问题 2:能不能只给人“进入目录”的能力?

假设我们有一个目录test_dir,现在只给其他人 x 权限:

chmodo=x test_dir

此时其他用户(o)的权限是--x

会发生什么?

  • 该用户可以cd test_dir成功进入目录。
  • 进入后执行ls会报错,因为没有 r 权限,看不到文件列表。
  • 但是!如果该用户事先知道目录里某个具体文件的完整路径,比如test_dir/readme.txt,并且他对那个文件拥有读权限,那么他就可以直接cat test_dir/readme.txt读取文件内容。

理解:你朋友家门牌号被遮住了(没有 r),但你记住了路(有 x),依然可以走到门前。只要门本身是开着的(文件有 r 权限),你就能看到里面的内容。

这里还要注意一点:
任何用户,无法进入其他用户的家目录!

问题 3:为什么普通用户能删掉别人的文件?

假设有两个普通用户alicebob,他们在同一个目录/shared下工作,目录权限是rwxrwxrwx(777)。
alice创建了一个文件alice.txt,权限是rwx------(只有 alice 自己能读写执行)。

现在 bob 去删这个文件:

rm/shared/alice.txt

结果竟然删掉了!明明 bob 对alice.txt没有任何写权限啊?

原因在于 Linux 的一个核心逻辑:
删除一个文件,本质上并不是修改这个文件的内容,而是在修改它“所在目录”的内容。
你把目录想象成一个花名册,删除文件只是从名册上划掉一个名字。至于文件本身的属性,并不直接决定能否被删除。

所以,删除文件需要的能力是:

  • 所在目录拥有w(写)权限(能修改名册)
  • 所在目录拥有x(执行)权限(能进入该目录到达名册前)
  • 文件本身的权限,删除时不关心。



结语:

今天的内容到这里就结束了,希望你能有所收获~

干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _