- 发布日期
Linux用户和权限(一):超级用户与账号管理
- 作者
- 姓名
- 缘
- 社交账号
文章目录
本篇学习范围
Linux 是多用户操作系统。不同账户拥有不同的目录、身份和权限,系统不会默认允许每个用户修改所有文件。
本篇按“获得合适权限,再管理账号”的顺序,完整覆盖:
root和普通用户的区别。su、exit、sudo的使用边界。- 如何为普通用户配置
sudo。 - 用户组与用户的创建、删除、查询和调整。
getent输出中每一列信息的含义。
下一篇会解释文件权限字符串、chmod 的字符与数字写法,以及 chown 修改所属用户和用户组。
多用户模式与 root
Windows、macOS 和 Linux 都采用多用户管理模式。每个账户只应该拥有完成自身任务所需的权限,这样一个普通操作失误不会轻易破坏整个系统。
Linux 中权限最高的账户名是:
root
它常被称为超级管理员。root 能够修改系统配置、创建系统目录、管理其他用户、改变文件所有权等。普通用户的权限通常只在自己的 HOME 目录中较为完整:
/home/用户名
以普通用户 alice 为例:
/home/alice
普通用户通常可以在这里创建、修改、删除自己的文件,但在 /etc、/usr、根目录 / 等系统位置往往只能读取或执行,不能随意写入。
这种限制不是障碍,而是保护机制。日常工作应保持普通用户身份,需要管理员权限时再临时提升。
su:切换用户身份
su 来自 Switch User,用于切换当前 Shell 的用户身份。课件中的基础语法是:
su [-] [用户名]
其中:
| 部分 | 含义 |
|---|---|
用户名 | 要切换到的目标用户;省略时默认切换到 root |
- | 切换后按目标用户的登录环境加载环境变量,通常建议带上 |
常见写法:
# 切换到 root,并加载 root 的登录环境
su -
# 等价地显式指定 root
su - root
# 切换到普通用户 alice
su - alice
普通用户切换到其他用户时,需要输入目标用户的密码。例如 alice 执行 su - root,需要输入 root 的密码。
root 切换到其他用户时通常不需要目标用户密码,但这不是鼓励长期停留在 root 身份下的理由。
- 为什么建议带上
su root 只切换有效用户,可能保留原用户的部分环境;su - root 更接近一次完整的 root 登录,会加载目标用户的 HOME、PATH 等登录环境。学习和管理系统时,通常使用:
su -
可以通过下面两条命令观察身份和 HOME 是否变化:
whoami
echo $HOME
返回上一个用户
切换用户后,使用 exit 返回上一层 Shell:
exit
也可按快捷键:
Ctrl + D
例如:
alice
└─ su - root
└─ exit
└─ 回到 alice
每次临时完成 root 操作后及时 exit,可以降低误操作风险。
sudo:只为一条命令临时提权
长期使用 root 很危险。更推荐的方式是以普通用户登录,在确实需要管理员权限时只为单条命令加 sudo:
sudo 其他命令
例如:
sudo mkdir /test
sudo ls /root
sudo systemctl restart sshd
sudo 不会把当前终端永久切成 root。命令执行结束后,仍然是原来的普通用户,这符合“最小权限”原则。
并非所有用户都能使用 sudo
能否执行 sudo 由系统的 sudoers 配置决定。没有授权的用户执行时会被拒绝,因此不要看到某条命令报“not in the sudoers file”就尝试反复输入密码。
配置 sudoers
这一步必须在 root 身份下完成。使用 visudo 编辑 /etc/sudoers:
visudo
visudo 会在保存前检查语法,优于直接用普通编辑器修改 /etc/sudoers。在文件末尾添加一行,例如授予 itheima 用户完整 sudo 权限且不要求密码:
itheima ALL=(ALL) NOPASSWD: ALL
各部分含义:
| 片段 | 含义 |
|---|---|
itheima | 被授权的用户名 |
ALL=(ALL) | 可在任意主机上以任意目标用户身份执行授权命令 |
NOPASSWD: ALL | 执行任何授权命令时不再要求输入密码 |
编辑完成后,在 Vim 的命令模式输入:
:wq
保存并退出。课件中写作 wq,实际需要先输入冒号进入 Vim 底线命令模式。
NOPASSWD: ALL 对学习环境很方便,但在生产环境权限过大。实际系统应只授权必需用户、必需命令,并保留密码验证和审计记录。
用户与用户组的关系
Linux 既可以创建多个用户,也可以创建多个用户组。一个用户能够加入多个用户组。
用户 alice
├─ 主组:alice
├─ 项目组:developers
└─ 运维组:ops
文件权限会同时根据两个层级判断:
- 文件所属用户。
- 文件所属用户组。
因此,在后续权限管理中,不必把同样的权限逐一赋给每个用户。可以先建立用户组,再把一批用户加入该组,最后让文件或目录归属该组。
本节涉及的用户和用户组管理命令通常都需要 root 权限,或通过 sudo 执行。
用户组管理:groupadd 与 groupdel
创建用户组:
groupadd 用户组名
例如:
sudo groupadd itcast
删除用户组:
groupdel 用户组名
例如:
sudo groupdel itcast
删除前应该先检查组内成员和相关文件归属。用户组删除不等于自动处理所有仍以该组为归属的文件,也不应该把“删不掉”当作可以强制绕过检查的理由。
用户管理:创建、删除、查看和加入组
useradd:创建用户
课件中的基础语法:
useradd [-g -d] 用户名
常用选项:
| 选项 | 作用 |
|---|---|
-g 用户组 | 指定用户的主组;指定的组必须已经存在 |
-d HOME目录 | 指定用户 HOME 目录 |
不指定 -g 时,许多发行版会为新用户创建同名主组并自动加入。若已经存在同名组,创建时需要明确指定 -g,避免主组关系不符合预期。
示例:
# 默认创建用户及其默认 HOME 目录
sudo useradd alice
# 创建用户并加入已存在的 itcast 组
sudo useradd -g itcast bob
# 指定 HOME 目录
sudo useradd -d /data/carol carol
useradd 只负责创建账户等基础信息。实际系统中还可能需要设置密码、Shell、过期时间等,这些超出本课件的基础范围。
userdel:删除用户
userdel [-r] 用户名
| 写法 | 结果 |
|---|---|
userdel alice | 删除用户账户,保留其 HOME 目录 |
userdel -r alice | 删除账户,同时删除 HOME 目录 |
例如:
sudo userdel alice
sudo userdel -r bob
-r 主要会删除用户 HOME 目录和相关邮件文件,不会自动查找并删除该用户在系统其他目录中的所有文件。执行前应确认是否需要备份项目文件、SSH 密钥、配置和日志。
id:查看用户身份和组
id [用户名]
不带参数时查看当前用户:
id
带用户名时查看指定用户:
id alice
输出中通常能看到 UID、GID、主组以及附加组。它是确认“某个用户到底属于哪些组”的首选命令。
usermod -aG:加入附加用户组
usermod -aG 用户组 用户名
例如:
sudo usermod -aG itcast alice
其中:
| 部分 | 含义 |
|---|---|
-G | 设置附加用户组 |
-a | append,追加而不是覆盖原有附加组 |
-aG 应当作为整体使用。若只使用 -G,可能会覆盖用户原有的附加组,导致原先能访问的资源突然失去权限。修改组关系后,用户通常需要重新登录,新的组身份才会反映到新的会话中。
getent:查看系统用户和用户组数据库
getent 可以按系统的名称服务配置读取用户、用户组等数据库。
查看全部用户
getent passwd
每一行对应一个用户,通常由 7 个以 : 分隔的字段组成:
用户名:密码占位符:用户ID:组ID:描述信息:HOME目录:登录Shell
例如:
alice:x:1001:1001::/home/alice:/bin/bash
| 字段 | 示例 | 含义 |
|---|---|---|
| 用户名 | alice | 登录账户名 |
| 密码占位符 | x | 密码哈希通常不直接保存在此处 |
| 用户 ID | 1001 | UID |
| 组 ID | 1001 | 主组 GID |
| 描述信息 | 空 | 备注字段 |
| HOME 目录 | /home/alice | 用户个人目录 |
| 登录 Shell | /bin/bash | 登录后使用的命令解释器 |
查看全部用户组
getent group
每一行通常由 4 个以 : 分隔的字段组成:
组名称:组认证占位符:组ID:成员列表
例如:
itcast:x:1002:
最后一个字段列出以该组作为附加组的直接成员,空着时会保留末尾冒号。它不一定列出所有以该组作为主组的用户,因此结合 id 用户名 使用,才能更直观地确认某个具体用户的组关系。
账号管理的安全顺序
创建一个项目用户和组时,可以按下面的顺序思考:
先创建用户组
↓
创建用户并指定主组和 HOME
↓
用 usermod -aG 添加附加组
↓
用 id 验证组关系
↓
按需授予文件权限或 sudo 权限
不要反过来先把所有用户都给 root 或无条件 sudo,再试图靠口头约束避免误操作。账号、用户组与权限设计本身就是 Linux 安全模型的一部分。