当前位置:首页>Linux>Linux 从0到1 : 10 · 用户组与权限

Linux 从0到1 : 10 · 用户组与权限

  • 2026-10-11 06:28:47
Linux 从0到1 : 10 · 用户组与权限
     欢迎来到罐子的实验室
    今天来学习 用户组与权限

    本次目标

    理解 Linux「谁能做什么」的安全模型——用户、组、文件权限,以及如何提权(su / sudo)。

学完你能做什么:

  • 看懂 ls -l 输出里的权限位 rwxr-xr-x
  • 用 chmod 改权限、chown/chgrp 改所有者
  • 用 su / sudo 临时获得管理员权限
  • 理解 SUID 位的作用与风险

1. Linux 是多用户系统

Linux 从设计之初就是多用户的——一台机器上可以有很多人同时登录、各干各的,互不干扰。系统用两个机制管理这件事:

  • 用户(user)
    :每个使用者一个账号,有唯一用户名和 UID(数字 ID)。
  • 组(group)
    :用户的集合,方便批量授权。一个用户可以属于多个组。

所有用户信息存在 /etc/passwd(名字虽然叫 passwd,但现在不存密码了):

user@host:~$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin...user:x:1000:1000::/home/user:/bin/bash

每行 7 个字段,用 : 分隔:用户名 : 密码占位 : UID : GID : 备注 : 家目录 : Shell。

最重要的两个用户:

  • 你自己
    (如 user,UID 通常是 1000)
  • root
    (UID 0)—— 超级管理员,能做任何事,安全攻防的终极目标

动手练习 1:你属于哪些组

任务:用 id 命令查看你的 UID、GID 和所属的组。

参考答案:

user@host:~$ iduid=1000(user) gid=1000(user) groups=1000(user),27(sudo)

意思:你的 UID 是 1000、主组是 user,还额外属于 sudo 组。


2. 看懂权限位

ls -l 每行开头那 10 个字符就是权限信息:

user@host:~$ ls -ltotal 4-rw-r--r-- 1 user user 0 Jun 30 18:00 file.txtdrwxr-xr-x 2 user user 4096 Jun 30 18:00 mydir

拆解 -rw-r--r--:

- rw- r-- r--┃ ┃ ┃ ┗━━ 其他用户 (other)┃ ┃ ┗━━━━━ 所属组 (group)┃ ┗━━━━━━━━ 所有者 (user/owner)┗━━━━━━━━━━━━ 文件类型(- 普通文件,d 目录)

三组 rwx 分别对应:所有者 / 组 / 其他人。

每个字母的含义:

字符
对文件
对目录
r
可读内容
可列出目录里的文件名(ls)
w
可改内容
可在目录里增删文件
x
可执行
可进入该目录(cd)
-
无此权限
无此权限

所以 -rwxr-xr-- 表示:所有者可读写执行,组可读和执行,其他人只能读。

目录的 x 权限是重点

很多人困惑:为什么我设了目录 r 却还是进不去?因为进入目录需要 x 权限,不是 r。

  • r--
     —— 能 ls 看到文件名,但不能 cd 进去、不能读文件内容。
  • --x
     —— 能 cd 进去、访问已知文件名,但不能 ls。
  • r-x
     —— 既能 ls 也能 cd,最常见。

动手练习 2:解读权限

任务:解读 drwxr-x--- 这个权限串的含义。

参考答案:

  • d
     —— 这是一个目录
  • rwx
     —— 所有者可读、可写、可进入
  • r-x
     —— 组成员可读、可进入,但不能写
  • ---
     —— 其他人完全无权限

3. chmod:修改权限

chmod(change mode)改权限。两种写法:

符号模式:who +/-/= what

who
含义
u
所有者(user)
g
组(group)
o
其他人(other)
a
所有人(all,默认)

操作 +(加)、-(减)、=(设为)。

user@host:~$ touch f.txtuser@host:~$ ls -l f.txt-rw-r--r-- 1 user user 0 Jun 30 18:00 f.txtuser@host:~$ chmod u+x f.txt# 给所有者加执行权限user@host:~$ ls -l f.txt-rwxr--r-- ...# 变成 rwxuser@host:~$ chmod go-w f.txt# 去掉组和其他人的写权限(本来就没有,无变化)user@host:~$ chmod a+r f.txt# 所有人可读user@host:~$ chmod u=rw,go=r f.txt# 所有者读写,组和其他只读

数字模式:三位八进制

把 rwx 看成三个二进制位,r=4, w=2, x=1,加起来就是 0-7:

数字
权限
7
rwx
6
rw-
5
r-x
4
r--
0
---

三位数字分别是 user/group/other:

user@host:~$ chmod 755 f.txt# rwxr-xr-x(脚本/程序常用)user@host:~$ chmod 644 f.txt# rw-r--r--(普通文件常用)user@host:~$ chmod 600 f.txt# rw-------(私密文件)user@host:~$ chmod 777 f.txt# rwxrwxrwx(⚠️ 所有人可写,危险)

动手练习 3:设个私密文件

任务:创建 secret.txt,权限设成只有你自己能读写(其他人完全无权限)。

思路引导:chmod 600 secret.txt。

参考答案:

user@host:~$ echo ”my password” > secret.txtuser@host:~$ chmod 600 secret.txtuser@host:~$ ls -l secret.txt-rw------- 1 user user 12 Jun 30 18:00 secret.txt

常见错误:

  • ❌ chmod 777 —— 这等于「所有人都能改」,除非你明确要共享,否则别用。
  • ⚠️ 改了权限还是 Permission denied?可能你不是所有者——只有所有者或 root 能改权限。

4. chown / chgrp:改所有者

文件属于谁、属于哪个组,也能改:

# chown 用户 文件 —— 改所有者# chown 用户:组 文件 —— 同时改所有者和组# chgrp 组 文件 —— 只改组
root@host:~# chown alice file.txt # 把 file.txt 给 alice(要 root 权限)root@host:~# chown alice:devs file.txt # 所有者 alice,组 devsroot@host:~# chgrp devs file.txt # 只改组

⚠️ 通常只有 root 能 chown(普通用户不能把文件「送给」别人)。chgrp 则要求你既是所有者、又属于目标组。

-R 递归改目录下所有内容:

root@host:~# chown -R alice /home/alice/project

动手练习 4:理解所有权

任务:用 ls -l 看 /etc/shadow(密码哈希文件)的所有者和权限,思考为什么普通用户读不了。

参考答案:

user@host:~$ ls -l /etc/shadow-rw-r----- 1 root shadow 1200 Jun 30 18:00 /etc/shadow

所有者是 root,组是 shadow,权限 rw-r-----:root 可读写,shadow 组可读,其他人(包括你)完全无权限。这就是为什么 cat /etc/shadow 会 Permission denied。


5. su:切换用户

su(switch user,原意 substitute user)让你切换成另一个用户,默认切到 root:

user@host:~$ suPassword:# 输入 root 密码root@host:/home/user# # 变成 root 了(提示符变 #)root@host:/home/user# exit # 退出,变回 user

su 用户名 切到指定用户:

user@host:~$ su alicePassword:alice@host:/home/user$

su -(或 su -l 用户)会模拟完整登录——加载该用户的环境变量、切到其家目录:

user@host:~$ su - alice# 比 su alice 更彻底

💡 su 要知道目标用户的密码。这在多用户共享机器时意味着密码要传来传去,不太方便也不太安全——所以现代系统更常用 sudo。

动手练习 5:体会 su(如有 root 密码)

任务:如果你的机器有 root 密码,su 切到 root,看提示符变成 #,再 exit 回来。没有 root 密码就跳过,看下一节 sudo。


6. sudo:以管理员身份执行单条命令

sudo(superuser do)让你以 root 身份执行一条命令,不需要 root 密码——它检查 /etc/sudoers 配置,看你的用户/组有没有授权,然后让你输自己的密码确认:

user@host:~$ cat /etc/shadowcat: /etc/shadow: Permission denieduser@host:~$ sudo cat /etc/shadow[sudo] password for user:# 输你自己的密码root:$6$...(密码哈希)...

sudo 比 su 安全得多:

  • 只执行一条命令,不会一直保持 root 身份。
  • 用自己的密码,不用知道 root 密码。
  • 可在 /etc/sudoers 里精细授权(谁能用 sudo 干什么)。
  • 所有 sudo 操作都会记日志(/var/log/auth.log),便于审计。

💡 sudo !! 是经典快捷操作:用 sudo 重跑上一条失败的命令。比如你打了 apt install xxx 失败(权限不足),直接 sudo !! 就行。

user@host:~$ apt install slE: Could not open lock file ... Permission denieduser@host:~$ sudo !!sudo apt install sl# 自动展开成这条

动手练习 6:用 sudo 看影子文件

任务:用 sudo cat /etc/shadow 读取影子密码文件(假设你在 sudoers 里)。

参考答案:

user@host:~$ sudo cat /etc/shadow | head -3root:$6$xxx:...daemon:*:......

常见错误:

  • ❌ user is not in the sudoers file —— 你的账号没 sudo 权限,需要管理员把你加进 sudo 或 wheel 组。
  • ⚠️ sudo 默认每 5 分钟内免再次输密码,别离开终端让人钻空子。

7. 密码存储:/etc/shadow

早期的 Unix 把密码哈希存在 /etc/passwd,但这个文件所有人都能读(很多程序要读用户名),于是密码哈希被搬到 /etc/shadow,只有 root 能读。

root@host:~# head -2 /etc/shadowroot:$6$xyz$哈希值:19000:0:99999:7:::daemon:*:19000:0:99999:7:::

每行:用户名 : 密码哈希 : ...其他策略字段。

  • *
     或 ! —— 该账户禁用密码登录(系统服务账户常见)。
  • 空 —— 没设密码(危险)。
  • $6$...
     —— SHA-512 哈希(加盐),登录时把你输的密码同样哈希后比对。

💡 这意味着即使拿到 /etc/shadow,也不能直接看到明文密码——只能用「字典爆破」工具(如 john)慢慢试。所以强密码 + 限制 shadow 读取权限很重要。


8. SUID:以文件所有者身份执行

rwx 之外还有几个特殊位,最关键的是 SUID(Set-owner-User-ID)。给一个可执行文件设了 SUID 后,任何人运行它,它都以「文件所有者」的身份执行。

user@host:~$ ls -l /usr/bin/sudo-rwsr-xr-x 1 root root 232K Dec 1 11:45 /usr/bin/sudo

注意所有者的执行位是 s 而不是 x——这就是 SUID 标志。意思是:无论谁运行 /usr/bin/sudo,它都以 root 身份运行(因为文件所有者是 root)。这正是 sudo 能提权的原理。

su、passwd(改自己密码却要写 /etc/shadow)也都靠 SUID。

设 SUID:

root@host:~# chmod u+s 某程序

⚠️ SUID 是把双刃剑。给一个 root 拥有的程序设 SUID = 任何能运行它的人都能借它变成 root。一旦该程序有漏洞,整个系统的 root 权限就可能被攻破。所以永远不要随意给程序加 SUID,定期审计系统里的 SUID 文件:find / -perm -4000 2>/dev/null。

动手练习 7:找系统里的 SUID 程序

任务:列出系统上所有设置了 SUID 的可执行文件。

参考答案:

user@host:~$ find / -perm -4000 2>/dev/null/usr/bin/sudo/usr/bin/su/usr/bin/passwd/usr/bin/chsh/usr/bin/newgrp/usr/bin/gpasswd...

(你应该看到的都是系统自带的合法程序。如果出现不认识的、尤其是 /tmp 之类的位置,就要警惕了。)


9. 权限的常见组合速记

场景
推荐权限
数字
公开可读的普通文件
rw-r--r--
644
私密文件(只有自己读写)
rw-------
600
可执行程序/脚本
rwxr-xr-x
755
私密可执行
rwx------
700
公开目录(可进可看不可改)
rwxr-xr-x
755
私密目录
rwx------
700
团队共享目录
rwxrwx---
770
⚠️ 完全开放(危险)
rwxrwxrwx
777

本模块速查表

命令
作用
id
查看自己的 UID/GID/组
ls -l
查看权限
chmod 模式 文件
改权限
chmod 755 文件
数字模式
chown 用户 文件
改所有者(通常需 root)
chgrp 组 文件
改组
su 用户
切换用户(要目标密码)
sudo 命令
以 root 执行单条(要自己密码)
sudo !!
sudo 重跑上条命令

权限位

- rw- r-- r-- (普通文件 rw-r--r-- = 644)┃ ┃ ┃ ┗━ other┃ ┃ ┗━━━ group┃ ┗━━━━━━ owner┗━━━━━━━━━ 文件类型 (- 文件 / d 目录)

rwx 数字

r=4 w=2 x=1 → 三位相加7=rwx 6=rw- 5=r-x 4=r-- 0=---

特殊位

位
标志
含义
SUID
s
(user 位)
以所有者身份执行
SGID
s
(group 位)
以组身份执行/目录继承组
Sticky
t
(other 位)
目录内只能删自己的文件(如 /tmp)

下一步

你已掌握了命令、文件、权限。但每条命令都得手动敲、敲完就忘——能不能把一组命令存成脚本,按顺序自动跑?下一模块就带你写出第一个 Shell 脚本。

最新文章

随机文章