Linux 权限管理

Linux 权限管理

七月 13, 2025 次阅读

在 Linux 中,用户一般分为两大类,一类是超级管理员,即 root 用户(对标 windows 中的 管理员),另一类则是普通用户

  • root 用户:除了一些系统级别的权限,谁都拦不住它,后面我将要讲到的权限,你会发现没有一个能管得住 root,正所谓规矩是 root 定的,那自然规矩是拦不住 root 的
  • 普通用户:如果 root 是掌权者的话,那普通用户就是百姓了,一切的权限都是对普通用户的管理

在讲解权限之前,先要讲几个小小的知识点:

权限理解前置知识

su 指令切换用户身份

su 指令是用于切换当前用户身份的,具体如下:

指令形式 指令说明
su 切换到超级管理员(root)
su xxx 切换到 xxx 用户身份(也可以是root用户)

示例如下:

# 需要密码验证
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  su
Password:
# 不需要密码验证
┌─[root@VM-16-15-debian] - [/home/ljx/linux_review/lesson1/dir1] - [630]
└─[$] su ljx                                                                                                 [14:27:47]
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤

切换用户是需要密码的,在 Linux 当中,所有的用户都需要有密码,通过这个示例我们可以看到,普通用户切换身份的时候是需要输入密码的,但是
正如我前面所说,root 想要切换用户谁也拦不住,因此不需要输入密码就直接切换了

Linux 用户创建

创建用户非常简单,系统默认的用户创建命令用起来非常不爽,因此他需要你手动创建用户然后手动设置密码,且有一些必要的工作也得自己后期去处理,
下面以 debian/ubuntu 系统为例,使用这俩系统自带的用户创建命令来创建一个新的用户:

# adduser [用户名]
┌─[root@VM-16-15-debian] - [~] - [660]
└─[$] adduser liangfei                                                                                       [14:49:22]
Adding user `liangfei' ...
Adding new group `liangfei' (1006) ...
Adding new user `liangfei' (1006) with group `liangfei (1006)' ...
Creating home directory `/home/liangfei' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for liangfei
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
Adding new user `liangfei' to supplemental / extra groups `users' ...
Adding user `liangfei' to group `users' ...

adduser 命令采用交互式的方式一步步创建用户信息,用起来非常的方便,把这条命令输入进去后根据他的提示一步步操作即可

对应的,删除用户可以使用 deluser 来完成,但需要注意的是,adduser 指令和 deluser 指令都需要 root 用户来操作,普通用户是操作不了的

sudo 命令

有人可能就会问了,真的只能有 root 用户有这么强大的实力吗,其他普通用户有时候也需要拥有像 root 这样强大的能力,怎么办呢

这里就需要讲到一个新的命令 sudo:

有些命令对于普通用户来说会受到权限的约束,但我们有的时候确实需要访问这个权限怎么办呢?那就在你想要操作的命令最前面加上 sudo,在进行用户身份验证后(输入密码)
就可以使用该命令了:

# 我现在是一个普通用户,但我想删除刚刚我创建的这个用户,直接使用该指令删除会发现命令行提示只有 root 用户才具备此权限
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  deluser liangfei                                                                                               1 ↵
deluser: Only root may remove a user or group from the system.
# 那么我们在该命令前面添加上 sudo 选项,然后验证本人是 ljx 就可以使用该命令了
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  sudo deluser liangfei                                                                                          1[sudo] password for ljx:
Removing crontab ...
Removing user `liangfei' ...
Done.

当然,sudo 指令的使用是得经过 root 同意的,只有 root 用户才可以给予用户 sudo 的使用权限

下面我们利用创建好的 liangfei 来举例:

普通的 liangfei 是无法直接使用 sudo 指令的:

liangfei@VM-16-15-debian:/home/ljx/linux_review/lesson1/dir1$ sudo su root
[sudo] password for liangfei:
liangfei is not in the sudoers file.

此时 root 通过修改文件的白名单将 liangfei 加入到 sudoer 组里面去 ,使得 liangfei 也具有使用 sudo 的权限:

我们在/etc/sudoers 文件中加入如下语句

liangfei ALL=(ALL:ALL) ALL

保存并退出,会发现 liangfei 也可以使用 sudo 指令了:

liangfei@VM-16-15-debian:/etc$ sudo whoami
root
liangfei@VM-16-15-debian:/etc$ sudo su root
┌─[root@VM-16-15-debian] - [/etc] - [735]
└─[$]      

Linux 权限理解

下面正式开始讲解 Linux 的权限:

我们打开一个文件,通过 ll 指令查看文件的详细信息,会看到:

╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll
total 8
drwxr-xr-x 2 ljx ljx 4096 Jul 12 23:27 dir
drwxr-xr-x 2 ljx ljx 4096 Jul 13 11:11 dir1
-rw-r--r-- 1 ljx ljx    0 Jul 12 21:59 test.txt

一共有三行信息,每一行都表示一个文件的各种属性,下面这张图是对每行属性的表述

authority

从右往左看,最右边的是文件名,其次是文件本创建或者修改的日期,再接着就是文件所消耗的内存大小,因此,我们需要讨论的是左边类似于 “drwxr-xr-x 2 ljx ljx” 这样
的信息

首先,最左边的符号表示的是文件类型,d 表示目录文件,- 表示普通文件,目前暂时只需要了解这两个,在 Linux 中,系统是不认文件后缀的,系统只认文件信息最前面的这个文件标识,
因此,不能以 windows 的视角来看待 Linxu 中的文件,windows 中确实是通过文件后缀来分辨文件类型的,但 Linux 并非如此

文件类型右边的东西就是我们要重点讨论的权限了,我们选取 dir 中的权限标志,截取出来后是这样的

rwxr-xr-x

让我们对这个标志三个一看:

rwx r-x r-x

可以看到,这个权限标识是对三类用户进行约束的,第一个是对文件所有者的约束,第二个是对文件所属用户组的约束,第三个是对其他用户的约束(既不属于
文件所有者也不属于文件所属用户组)

而右边的两个名字(ljx ljx)则表示的是文件所有者和文件所属用户组分别是谁,可以看到,默认每个文件的所有者和所属用户组均为文件创建者本身

rwx 中的三个标识分别表示 read、write、execute,表示是否可读、可写、可操作,字母显示则表示对应权限有效,若为-则表示对应权限无效

就拿上面这个权限标识(rwx r-x r-x)做比方,表示的是拥有者(rwx)可读可写可操作该文件,用户组和其他用户(r-x)可读,可操作,但是不能写,因为写位置对应的是-,而不是w

权限是可以通过 chmod 指令来修改的,下面我们将隆重介绍一下 chmod 指令:

chmod

首先讲解一下文件权限的两种表示方法

文件权限值的表示方法

a) 字符表示方法
Linux表示 说明 Linux表示 说明
r– 只读 -w- 仅可写
–x 仅可执行 rw- 可读可写
-wx 可写和可执行 r-x 可读可执行
rwx 可读可写可执行 无权限
b) 8进制数值表示方法
权限符号(读写执行) 八进制 二进制
r 4 100
w 2 010
x 1 001
rw 6 110
rx 5 101
wx 3 011
rwx 7 111
0 000

该指令用于修改用户权限,依照的就是这两种表示方法来修改的,一种是通过对 rwx 三个字母进行加减,另一种则是通过八进制的方式直接修改文件权限属性,
只有文件的拥有者和root才可以改变文件的权限

指令格式

`chmod [参数] 权限 文件名` 

下面是对 chmod 命令两种权限值修改方式的说明:

chmod命令权限值的格式

① 用户表示符+/-权限字符
符号 说明
+ 向权限范围增加权限代号所表示的权限
- 向权限范围取消权限代号所表示的权限
= 向权限范围赋予权限代号所表示的权限

用户符号

  • u:拥有者
  • g:拥有者同组用户
  • o:其它用户
  • a:所有用户

实例:

# 给文件拥有者添加写权限
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod u+w dir
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll
total 8
drwxr-xr-x 2 ljx ljx 4096 Jul 12 23:27 dir
drwxr-xr-x 2 ljx ljx 4096 Jul 13 11:11 dir1
-rw-r--r-- 1 ljx ljx    0 Jul 12 21:59 test.txt
# 取消其他用户的执行权限  
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod o-x dir
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll
total 8
drwxr-xr-- 2 ljx ljx 4096 Jul 12 23:27 dir
drwxr-xr-x 2 ljx ljx 4096 Jul 13 11:11 dir1
-rw-r--r-- 1 ljx ljx    0 Jul 12 21:59 test.txt
② 三位8进制数字表示法

使用数字表示权限组合,每位数字分别对应:

  • 第一位:所有者(u)权限
  • 第二位:同组用户(g)权限
  • 第三位:其他用户(o)权限

权限数值对照:

  • 4:读(r)
  • 2:写(w)
  • 1:执行(x)
  • 组合权限为数值相加(如 rw- = 4+2 = 6

实例:

# 设置权限:所有者可读可写(6),同组用户可读可写(6),其他用户仅可读(4)
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod 664 dir
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll
total 8
drw-rw-r-- 2 ljx ljx 4096 Jul 12 23:27 dir
drwxr-xr-x 2 ljx ljx 4096 Jul 13 11:11 dir1
-rw-r--r-- 1 ljx ljx    0 Jul 12 21:59 test.txt
# 设置权限:所有者可读可写(6),同组用户可读(4),其他用户无权限(0)
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod 640 dir
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll
total 8
drw-r----- 2 ljx ljx 4096 Jul 12 23:27 dir
drwxr-xr-x 2 ljx ljx 4096 Jul 13 11:11 dir1
-rw-r--r-- 1 ljx ljx    0 Jul 12 21:59 test.txt

下面我们要重点讨论一下这三个标识对于普通文件和目录文件分别表示什么含义:

rwx 对于普通文件的含义

r(读权限)

当用户没有 r 权限时,就无法读取文件内的内容了:

# 通过 chmod 使得文件所有者失去读权限
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod u-r test.txt        
# 检查是否失去读权限
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll
total 8
d---r----- 2 ljx ljx 4096 Jul 12 23:27 dir
drwxr-xr-x 2 ljx ljx 4096 Jul 13 11:11 dir1
--w-r--r-- 1 ljx ljx    0 Jul 12 21:59 test.txt
# 用户无法读取文件数据了
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  cat test.txt
cat: test.txt: Permission denied

w(写权限)

当用户没有 w 权限时,就无法写入数据到文件中了:

╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod u-w test.txt
# 用户无法写入数据了
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  echo 123 >> test.txt
zsh: permission denied: test.txt

x(操作权限)

操作权限在普通文件上一般体现不出来,我们拿可执行程序来看:

可执行程序被编译出来后默认是由执行权限的:

# test.o 文件为可执行程序
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  ll
total 196
-rw-r--r-- 1 ljx ljx     94 Jul 13 10:44 error.log
-rw-r--r-- 1 ljx ljx    102 Jul 12 22:16 test.cc
-rwxr-xr-x 1 ljx ljx  16544 Jul 13 17:02 test.o
-rw-r--r-- 1 ljx ljx 168894 Jul 13 11:11 test.txt
# 此时可以正常运行该程序
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  ./test.o
hello world

接下来我们尝试关闭该可执行程序的操作权限:

╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  chmod u-x test.o
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir1
╰─➤  ./test.o
zsh: permission denied: ./test.o

可以看到,没有执行权限后是无法执行该可执行程序的

rwx 对于目录文件的含义

这里我们又要提到一个非常经典的语句:Linux 中一切皆文件,因此 rwx 对于目录文件真正作用的是目录文件的内部数据

r(读权限)

╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod u-r dir
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  ll dir
ls: cannot open directory 'dir': Permission denied

没有读权限,我们就无法通过 ll 指令读取目录中的具体数据了

w(写权限)

没有写权限,我们就无法在文件中创建任何文件了,因为创建文件本质是往目录文件中写入数据

╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  cd dir
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  mkdir dir1                                                                                                     2 ↵
mkdir: cannot create directory ‘dir1’: Permission denied

x(操作权限)

没有操作权限,我们就无法进入该文件了,因为进入该文件的过程本质是访问目录文件,属于对目录文件的一种操作

╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod u-x dir                                                                                                  1 ↵
╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  cd dir
cd:cd:1: permission denied: dir

现在就有了一个新的问题,我作为非文件拥有者,因为权限设置,虽然我无法修改文件的信息,但我可以删除该文件,
这样看来是不是就非常不科学呢?因此我们需要引入一个新的标识叫做粘滞位

粘滞位

粘滞位是对目录文件属性的一种修改,当目录文件被加上粘滞位时,目录文件中的任何文件删除的权限就都属于该文件的创建者或者 root 了,
粘滞位添加方式如下:

╭─ljx@VM-16-15-debian ~/linux_review/lesson1
╰─➤  chmod +t dir1

最后我们再就可以理解为什么 Linux 中的家目录下属于每个人的目录只有自己和 root 可以进去,而其他人是没有访问权限了:

╭─ljx@VM-16-15-debian /home
╰─➤  ll
total 20
drwx------ 12 coconut    coconut    4096 Apr 19 12:26 coconut
drwx------  2       1006       1006 4096 Jul 13 15:31 liangfei
drwxr-xr-x  2 lighthouse lighthouse 4096 Sep 14  2024 lighthouse
drwx------ 29 ljx        ljx        4096 Jul 13 17:19 ljx
drwx------  7 zhang      zhang      4096 Nov  5  2024 zhang

可以看到,home 下的每个目录文件操作权限只属于文件拥有者,因此其他人是无法进入该文件的

权限掩码

当我们创建普通文件的时候默认权限是666,而创建一个目录文件的时候默认权限是777,这是因为普通文件一般不需要操作权限(可执行程序除外),
而目录文件如果不给操作权限用户连进去都不可以,所以目录文件默认权限是666,但是我们会发现,我们创建普通文件和目录文件默认的权限并不是666和777:

╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  ll
total 4
drwxr-xr-x 2 ljx ljx 4096 Jul 13 17:25 dir
-rw-r--r-- 1 ljx ljx    0 Jul 13 17:25 test.cc

为什么它们的文件用户组和其他用户都失去了读权限?这就涉及到了权限掩码:

我们可以查看到我们的权限掩码是多少:

╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  umask
022

可以看到我们的权限掩码是 022,即000 010 010,可以看到,被屏蔽的两个读权限在权限掩码上正好对应
的是1,因此权限掩码的作用是使得自己所对应二进制位上为1的地方所对应权限被ban掉,如果我们想给
文件的用户组默认拥有读权限,可以通过修改umask为002来实现:

# 修改掩码为 002
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  umask 002
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  touch test.cc
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  mkdir dir
# 用户组默认拥有了读权限
╭─ljx@VM-16-15-debian ~/linux_review/lesson1/dir
╰─➤  ll
total 4
drwxrwxr-x 2 ljx ljx 4096 Jul 13 17:30 dir
-rw-rw-r-- 1 ljx ljx    0 Jul 13 17:30 test.cc