1756 字
9 分钟
Linux 用户管理

用户管理#

1. 用户与用户组(Users and Groups)#

在任何传统的操作系统中,都会存在“用户”和“用户组”的概念,它们存在的唯一目的就是进行访问控制和权限管理

当系统运行一个进程,它是以该进程所属的用户的身份运行的。文件的访问权限和所有权也是基于用户身份判断的。你当然不希望 Elo 随意访问 Mo 的文件,反之亦然

每个用户都有一个专属的主目录,用于存储用户的个人文件,通常位于:

Terminal window
/home/example_username

不同的 Linux 发行版中,路径位置可能略有不同

所以,系统是如何识别用户的?

系统使用 UID(用户 ID) 来识别每一个用户

  • 用户名只是为了方便人类使用和记忆
  • 但是系统内部的识别是依靠 UID

同样地,系统使用 GID(组 ID) 来识别用户组

  • 用户组是一组用户的集合
  • 系统可以为一个组统一设置权限
  • 所有属于这个组的用户都继承这个权限

除了人类用户以外,还有系统用户

在 Linux 中,除了你创建的普通用户以外,还有一些特殊的用户存在于系统中,这些用户通常是**系统进程(daemon)**的运行身份,它们保持系统在后台稳定运行

所有用户中,最重要的系统用户是 root,也叫超级用户(superuser)

  • root 是系统中权限最大的用户,可以访问任何文件,启动或终止任何进程
  • 正因为 root 权限无限,所以不建议长期使用 root 身份操作系统,如果操作失误,可能会破坏整个系统

如果需要以 root 权限运行某个命令,在拥有使用 sudo 的权限的情况下,可以使用:

Terminal window
sudo example_command

sudosuperuser do 的缩写,意思是“以超级用户执行操作”

还记得 ls -la 吗? 通过 -l , 我们可以查看更多的信息,现在我们使用此命令来查看 /etc/shadow

也许你会看到这样的输出:

ls_shadow

它们的意思是:

Terminal window
权限 硬链接数 所有者 所属组 大小 修改日期 文件名
-rw-r----- 1 root shadow 1048 6月 13 22:53 /etc/shadow

目前的阶段,我们所关心的部分是权限、所有者和所属组三个部分

对于权限部分,可以分为四个部分:

文件类型 所有者权限 所属组权限 其他人权限
- rw- r-- ---
  1. 文件类型 - :意思是普通文件,如果是 d,则代表一个目录
  2. 权限一共10位:1类型 + 3 × 权限段
  3. 对文件的意义:r = 读,w = 写,x = 执行

因此,对于 /etc/shadow 的权限解读,可以被理解为:

  1. 该文件为普通文件
  2. 如果访问者是 root(文件所有者),则拥有对该文件的 读取和写入权限
  3. 如果是所属于 shadow 组的用户,则拥有读的权限
  4. 如果都不属于,则属于其他人,没有任何权限

如果文件类型是d,那么r代表列出目录下的文件名(ls)的权限、w 代表创建/删除/重命名文件的权限、x 代表进入目录(cd),访问目录里的内容的权限

当用户访问文件时,系统会按顺序判断用户身份是否为所有者 → 所属组成员 → 其他人,一旦匹配,就使用对应权限,不再继续判断

但是,root 可以无视上述的权限访问顺序

2. root#

前面已经够学习过获取超级用户权限的方法:使用 sudo 命令

除此之外,你也可以使用 su 命令来运行超级用户身份运行命令

su 是 “substitute user” 的缩写,表示切换用户

如果你不指定用户名,它会默认切换到 root 用户

Terminal window
$ su

如果你知道目标用户的密码,你就可以通过 su example_username 切换到任何用户

这种方法有一些缺点:

  • 一旦切换为了 root,后面执行的每一个命令都有最高权限,稍有疏忽可能会导致严重问题
  • 使用 su 切换后执行的操作,不会记录在 sudo 的日志内,无法具体追踪谁做了什么修改

因为,使用 sudo ,是更安全、更规范的方式

那么,系统如何找到谁可以使用 sudo

它通过一个配置文件管理:

Terminal window
/etc/sudoers

该文件列出了哪些用户可以使用 sudo 命令,并指定了它们执行那些命令、是否需要密码的规则

你当然可以直接使用 sudo nano /etc/sudoers 来编辑配置文件

但你更应该使用 visudo 来编辑它

Terminal window
sudo visudo

当你使用 visudo 打开的时候,实际上编辑的是 etc/sudoers.tmp,只有在保存并验证成功的时候它才会

Terminal window
mv /etc/sudoers.tmp /etc/sudoers

如果你在编辑的过程中犯了错误,会显示错误信息,然后告诉你具体的选项,就像是这样:

visudo

如果使用 sudo nano /etc/sudoers 的话,直接修改原本的文件,如果发生错误,系统会拒绝所有 sudo 操作

3. /etc/password#

既然系统使用 UID 来标识用户,那么用户和 UID 的映射关系存储在哪里呢?

使用如下命令:

Terminal window
$ cat /etc/passwd

可以得到这样的结果:

passwd

我们取第一行单独分析:

Terminal window
用户名 密码字段 用户ID 组ID GECOS 用户主目录 默认shell
root : x : 0 : 0 : root : /root : /bin/bash

补充解释:

  1. 密码字段 x 标识密码实际存储在 /etc/shadow 中,/etc/passwd 仅做占位和兼容(防止用户直接看到密码 hash)
  2. root 用户的 UID 总是 0,普通用户从 1000 或 500 开始
  3. root 的主组也是 0 ,可以在 etc/group 文件中查找组名和组 ID
  4. GECOS 段,名字的由来是历史问题。它是存放用户备注信息的标准字段,一般很少使用。但是如果使用的话,可能会是如下的样子,通常用逗号分隔:
Terminal window
jack:x:1001:1001:Jack Ma,Room 303,555-1234,555-5678,Alibaba:/home/jack:/bin/bash
  1. 用户主目录,即登陆后所在目录
  2. 用户登陆以后可以使用的 shell,如 /bin/bash,如果是 /usr/sbin/nologin ,代表该账户不能登陆系统

什么叫无法登陆账户

”无法登陆“一般指的是不能通过常规方式(如终端,ssh,su,login命令)获得shell环境

有两种实现方式:

  1. Shell 字段被设置为 /usr/sbin/nologin
  2. /etc/shadow 里的密码字段是 *!!*

可以禁止密码登录系统服务账号,也可以禁止部分普通用户

**不推荐直接修改该文件,**以及后文提到的种种文件,强烈建议用专门的命令行工具(如 useradduserdel 等)来管理用户账户,既安全又可靠,我们将会在最后介绍

Linux 用户管理
https://mizuki.mysqil.com/posts/linux/5_user_management/
作者
Elopez
发布于
2025-09-25
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00