用户管理
1. 用户与用户组(Users and Groups)
在任何传统的操作系统中,都会存在“用户”和“用户组”的概念,它们存在的唯一目的就是进行访问控制和权限管理
当系统运行一个进程,它是以该进程所属的用户的身份运行的。文件的访问权限和所有权也是基于用户身份判断的。你当然不希望 Elo 随意访问 Mo 的文件,反之亦然
每个用户都有一个专属的主目录,用于存储用户的个人文件,通常位于:
/home/example_username不同的 Linux 发行版中,路径位置可能略有不同
所以,系统是如何识别用户的?
系统使用 UID(用户 ID) 来识别每一个用户
- 用户名只是为了方便人类使用和记忆
- 但是系统内部的识别是依靠 UID
同样地,系统使用 GID(组 ID) 来识别用户组
- 用户组是一组用户的集合
- 系统可以为一个组统一设置权限
- 所有属于这个组的用户都继承这个权限
除了人类用户以外,还有系统用户
在 Linux 中,除了你创建的普通用户以外,还有一些特殊的用户存在于系统中,这些用户通常是**系统进程(daemon)**的运行身份,它们保持系统在后台稳定运行
所有用户中,最重要的系统用户是 root,也叫超级用户(superuser)
root是系统中权限最大的用户,可以访问任何文件,启动或终止任何进程- 正因为
root权限无限,所以不建议长期使用 root 身份操作系统,如果操作失误,可能会破坏整个系统
如果需要以 root 权限运行某个命令,在拥有使用 sudo 的权限的情况下,可以使用:
sudo example_commandsudo 是 superuser do 的缩写,意思是“以超级用户执行操作”
还记得 ls -la 吗? 通过 -l , 我们可以查看更多的信息,现在我们使用此命令来查看 /etc/shadow
也许你会看到这样的输出:

它们的意思是:
权限 硬链接数 所有者 所属组 大小 修改日期 文件名-rw-r----- 1 root shadow 1048 6月 13 22:53 /etc/shadow目前的阶段,我们所关心的部分是权限、所有者和所属组三个部分
对于权限部分,可以分为四个部分:
文件类型 所有者权限 所属组权限 其他人权限- rw- r-- ---- 文件类型
-:意思是普通文件,如果是d,则代表一个目录 - 权限一共10位:1类型 + 3 × 权限段
- 对文件的意义:
r= 读,w= 写,x= 执行
因此,对于 /etc/shadow 的权限解读,可以被理解为:
- 该文件为普通文件
- 如果访问者是
root(文件所有者),则拥有对该文件的 读取和写入权限 - 如果是所属于
shadow组的用户,则拥有读的权限 - 如果都不属于,则属于其他人,没有任何权限
如果文件类型是d,那么r代表列出目录下的文件名(ls)的权限、w 代表创建/删除/重命名文件的权限、x 代表进入目录(cd),访问目录里的内容的权限
当用户访问文件时,系统会按顺序判断用户身份是否为所有者 → 所属组成员 → 其他人,一旦匹配,就使用对应权限,不再继续判断
但是,root 可以无视上述的权限访问顺序
2. root
前面已经够学习过获取超级用户权限的方法:使用 sudo 命令
除此之外,你也可以使用 su 命令来运行超级用户身份运行命令
su 是 “substitute user” 的缩写,表示切换用户
如果你不指定用户名,它会默认切换到 root 用户
$ su如果你知道目标用户的密码,你就可以通过 su example_username 切换到任何用户
这种方法有一些缺点:
- 一旦切换为了
root,后面执行的每一个命令都有最高权限,稍有疏忽可能会导致严重问题 - 使用
su切换后执行的操作,不会记录在sudo的日志内,无法具体追踪谁做了什么修改
因为,使用 sudo ,是更安全、更规范的方式
那么,系统如何找到谁可以使用 sudo ?
它通过一个配置文件管理:
/etc/sudoers该文件列出了哪些用户可以使用 sudo 命令,并指定了它们执行那些命令、是否需要密码的规则
你当然可以直接使用 sudo nano /etc/sudoers 来编辑配置文件
但你更应该使用 visudo 来编辑它
sudo visudo当你使用 visudo 打开的时候,实际上编辑的是 etc/sudoers.tmp,只有在保存并验证成功的时候它才会
mv /etc/sudoers.tmp /etc/sudoers如果你在编辑的过程中犯了错误,会显示错误信息,然后告诉你具体的选项,就像是这样:

如果使用 sudo nano /etc/sudoers 的话,直接修改原本的文件,如果发生错误,系统会拒绝所有 sudo 操作
3. /etc/password
既然系统使用 UID 来标识用户,那么用户和 UID 的映射关系存储在哪里呢?
使用如下命令:
$ cat /etc/passwd可以得到这样的结果:

我们取第一行单独分析:
用户名 密码字段 用户ID 组ID GECOS 用户主目录 默认shellroot : x : 0 : 0 : root : /root : /bin/bash补充解释:
- 密码字段
x标识密码实际存储在/etc/shadow中,/etc/passwd仅做占位和兼容(防止用户直接看到密码 hash) - root 用户的 UID 总是 0,普通用户从 1000 或 500 开始
- root 的主组也是 0 ,可以在
etc/group文件中查找组名和组 ID - GECOS 段,名字的由来是历史问题。它是存放用户备注信息的标准字段,一般很少使用。但是如果使用的话,可能会是如下的样子,通常用逗号分隔:
jack:x:1001:1001:Jack Ma,Room 303,555-1234,555-5678,Alibaba:/home/jack:/bin/bash- 用户主目录,即登陆后所在目录
- 用户登陆以后可以使用的 shell,如
/bin/bash,如果是/usr/sbin/nologin,代表该账户不能登陆系统
什么叫无法登陆账户?
”无法登陆“一般指的是不能通过常规方式(如终端,ssh,su,login命令)获得shell环境
有两种实现方式:
- Shell 字段被设置为
/usr/sbin/nologin /etc/shadow里的密码字段是*、!或!*
可以禁止密码登录系统服务账号,也可以禁止部分普通用户
**不推荐直接修改该文件,**以及后文提到的种种文件,强烈建议用专门的命令行工具(如 useradd、userdel 等)来管理用户账户,既安全又可靠,我们将会在最后介绍
部分信息可能已经过时