写在前面
为什么要写这篇博客?
小编最近搞了一台小服务器,然后要给同事们用,正常运维这个服务器就是给同事们添加账号,然后设置权限,这样子只是一些简单的操作,如果服务器出问题了,也不知道怎么去解决,所以小编想深入了解一下linux系统,本篇博客就从简单的添加用户开始入手,主要有以下几个问题:
- 如何添加用户?
- 用户背添加到哪里?实际的存储路径是啥?添加到组里是什么意思?
- 组是什么意思?为什么需要组?系统有哪些默认组?
- 路径中的home、bin等等分别代表什么意思?为什么会有这个的存在?
对用户的操作(增、删、改、查):
- 增加什么?用户名,用户id,用户密码,用户出生组,用户目录,用户权限等;
- 删除什么?
- 修改什么?用户名,用户id,用户密码,用户所在组,用户目录,用户权限等;
- 查找什么?用户名,用户id,用户密码,用户所在组,用户目录,用户权限等;
思维导图如下:
【Linux学习】Ubuntu对用户进行管理
在 Linux 系统中,用户管理是维护系统安全和资源分配的核心任务之一。无论是个人电脑还是服务器,合理的用户权限配置可以防止误操作、保护敏感数据,并支持多用户协作。本文将以 Ubuntu 为例,详细介绍用户管理的常用操作,涵盖创建、修改、删除用户,以及用户组和权限配置的技巧。
一、为什么需要用户管理?
- 系统安全:不同用户拥有不同权限,避免普通用户执行高危操作。
- 资源隔离:限制用户对文件、目录和进程的访问范围。
- 多用户协作:服务器环境中,多个用户可能共享同一系统,需独立配置环境。
二、用户管理基础操作
以下表格详细列举了用户与组管理命令的参数、缩写来源、示例及详细解释,涵盖 创建、修改、权限控制、安全策略 等核心操作。
(一)用户管理
1. 用户管理命令表格
以下为 Linux Ubuntu 系统中 用户管理 的核心命令及参数总结,涵盖 创建、删除、修改、权限分配、密码策略 等操作,并附有示例与详细解释。
命令 | 参数 | 缩写来源 | 示例 | 示例详细解释 |
---|---|---|---|---|
useradd | -m | make home directory | sudo useradd -m alice | 创建用户 alice ,并自动生成家目录 /home/alice 。 |
-d | directory | sudo useradd -d /data/alice -m alice | 指定家目录为 /data/alice (需确保目录存在或为空)。 | |
-s | shell | sudo useradd -s /sbin/nologin alice | 设置用户默认 Shell 为禁止登录(适用于服务账户)。 | |
-G | Groups | sudo useradd -G sudo,developers alice | 创建用户时直接加入 sudo 和 developers 组(覆盖原有附加组)。 | |
-u | user ID | sudo useradd -u 1500 alice | 指定用户 UID 为 1500 (避免与系统保留 UID 0-999 冲突)。 | |
-e | expire date | sudo useradd -e 2024-12-31 alice | 设置账户过期时间为 2024-12-31 ,过期后用户无法登录。 | |
adduser | (交互式) | 无缩写(封装工具) | sudo adduser alice | 交互式创建用户:自动生成家目录、提示设置密码,并填写用户信息(全名、电话等)。 |
usermod | -l | login name | sudo usermod -l alice_new alice | 将用户名从 alice 修改为 alice_new (需手动更新家目录名)。 |
-d | directory | sudo usermod -d /new_home/alice -m alice | 修改家目录为 /new_home/alice ,-m 表示迁移原家目录内容。 | |
-g | group | sudo usermod -g developers alice | 修改用户主组为 developers (需目标组已存在)。 | |
-aG | append Groups | sudo usermod -aG docker alice | 将用户追加到 docker 组(保留原有附加组)。 | |
-L | Lock | sudo usermod -L alice | 锁定用户账户(禁止登录),在 /etc/shadow 的密码字段前添加 ! 。 | |
-U | Unlock | sudo usermod -U alice | 解锁用户账户(需未被其他机制锁定)。 | |
userdel | -r | remove files | sudo userdel -r alice | 删除用户 alice 及其家目录和邮件池(谨慎操作,数据不可恢复)。 |
passwd | -l | lock | sudo passwd -l alice | 锁定用户密码(等同于 usermod -L )。 |
-u | unlock | sudo passwd -u alice | 解锁用户密码(需未被其他方式锁定)。 | |
-e | expire | sudo passwd -e alice | 强制用户下次登录时修改密码(适用于首次创建账户后)。 | |
-S | Status | sudo passwd -S alice | 显示账户状态:密码设置时间、有效期、警告天数等。 | |
chage | -E | Expiry date | sudo chage -E 2024-12-31 alice | 设置账户过期时间(与 useradd -e 功能相同)。 |
-M | Max days | sudo chage -M 90 alice | 密码最长有效期为 90 天,到期后必须修改。 | |
-W | Warn days | sudo chage -W 7 alice | 密码过期前 7 天提醒用户。 | |
-I | Inactive days | sudo chage -I 5 alice | 密码过期后,账户宽限期为 5 天,超时后完全锁定。 | |
id | -u | user ID | id -u alice | 显示用户 UID(输出 1001 )。 |
-g | group ID | id -g alice | 显示用户主组 GID(输出 1001 )。 | |
-Gn | Groups names | id -Gn alice | 显示用户所属的所有组名(输出 alice sudo developers )。 | |
groups | - | 无 | groups alice | 显示用户主组和附加组(输出 alice : alice sudo developers )。 |
getent | - | get entries | getent passwd alice | 查询用户详细信息(本地或远程用户),输出格式:alice:x:1001:1001::/home/alice:/bin/bash 。 |
2. 关键操作场景说明
场景一:创建用户并配置权限
sudo useradd -m -s /bin/bash -G sudo,developers -u 1500 alice # 创建用户
sudo passwd alice # 设置密码
- 验证:
id alice # 输出:uid=1500(alice) gid=1500(alice) groups=1500(alice),27(sudo),1001(developers)
补充:
Q1. 为什么需要指定
-s /bin/bash
?
(1) 允许用户交互式登录
- 如果不指定
-s
参数,系统会使用默认的 Shell(通常是/bin/sh
),但不同 Linux 发行版的默认 Shell 可能不同。- 使用
/bin/bash
可以确保用户获得一致的交互体验,因为 Bash 提供了更丰富的功能(如命令补全、历史记录、脚本支持等)。(2) 支持脚本和自动化
- Bash 是 Linux 系统中默认的脚本语言环境。如果用户需要运行脚本或自动化任务,使用 Bash 可以避免兼容性问题。
- 例如,用户可以直接在终端中执行脚本文件(如
./script.sh
),而无需额外配置。(3) 避免权限问题
- 如果用户需要访问文件系统、执行命令或运行服务,Bash 提供了完整的权限控制和环境变量支持。
- 如果未指定 Shell,用户可能无法正常使用系统功能(如无法运行
ls
、grep
等命令)。(4) 明确用户意图
- 通过显式指定
-s /bin/bash
,管理员可以明确该用户是交互式用户(需要登录和操作),而不是系统服务账户(不需要登录)。- 例如,为普通用户设置
/bin/bash
,为服务账户设置/sbin/nologin
。
Q2. 不指定
-s /bin/bash
有什么后果?
- 默认 Shell 可能不兼容:如果系统默认 Shell 是
/bin/sh
,用户可能无法使用 Bash 特有的功能(如[[ ]]
条件判断、数组等)。- 用户无法正常登录:如果未指定 Shell,系统可能使用
/bin/false
或/usr/sbin/nologin
,导致用户无法登录。- 脚本执行异常:某些脚本依赖 Bash 的特性(如
source
命令、[[
操作符),在非 Bash Shell 中可能无法运行。
Q3. 如何查看用户的默认 Shell?
grep username /etc/passwd
示例输出:
john_doe:x:1001:1001::/home/john_doe:/bin/bash nginx:x:1002:1002::/home/nginx:/sbin/nologin
其他常见 Shell 的用途
Shell 类型 | 路径 | 用途 |
---|---|---|
Bash | /bin/bash | 通用交互式 Shell,适合大多数用户。 |
sh | /bin/sh | 简单 Shell,兼容性好,但功能有限。 |
nologin | /sbin/nologin | 禁止用户登录,常用于服务账户(如 www-data 、mysql )。 |
zsh | /bin/zsh | 功能更强大的 Shell,支持语法高亮、插件扩展等。 |
dash | /bin/dash | 轻量级 Shell,常用于系统初始化脚本。 |
补充案例:
补充案例 1:创建普通用户
sudo useradd -m -s /bin/bash john_doe
- 目的:为用户
john_doe
创建主目录(-m
)并指定 Bash 作为默认 Shell。- 结果:用户可以登录系统、运行脚本、访问文件系统。
补充 2:创建服务账户
sudo useradd -s /sbin/nologin nginx
- 目的:创建服务账户
nginx
,禁止其登录系统。- 结果:
nginx
进程可以运行,但用户无法通过 SSH 登录。
补充案例 3:使用其他 Shell
sudo useradd -s /bin/zsh alice
- 目的:为用户
alice
指定 Zsh 作为默认 Shell。- 结果:用户登录后进入 Zsh 环境,享受更高级的功能。
补充总结:
- 如果用户需要登录系统、运行脚本或访问文件系统,使用
/bin/bash
是合理的选择。 - 如果用户是服务账户或仅需运行特定程序,可以选择
/sbin/nologin
或其他 Shell。 - 显式指定 Shell 可以避免兼容性问题,并明确用户角色。
场景二:修改用户属性
sudo usermod -l alice_new -d /home/alice_new -m alice # 重命名用户并迁移家目录
sudo usermod -aG docker alice_new # 追加到 docker 组
场景三:设置密码策略
sudo chage -M 60 -W 7 -E 2024-12-31 alice # 密码 60 天过期,过期前 7 天提醒,账户年底锁定
场景四:锁定并删除用户
sudo usermod -L alice # 锁定账户
sudo userdel -r alice # 删除用户及数据
3. 配置文件说明
文件 | 作用 |
---|---|
/etc/passwd | 存储用户基本信息(UID、GID、家目录、Shell 等)。 |
/etc/shadow | 存储用户密码哈希及安全策略(仅 root 可读)。 |
/etc/login.defs | 定义用户创建的默认规则(如 UID/GID 范围、密码策略)。 |
4. 注意事项
- 权限最小化:
- 普通用户不应拥有
sudo
权限,除非必要。 - 服务账户应禁用 Shell(
/sbin/nologin
)。
- 普通用户不应拥有
- 安全审计:
- 定期检查
/etc/passwd
和/etc/shadow
,清理无效账户。 - 使用
last
或lastlog
监控用户登录记录。
- 定期检查
- 备份数据:
- 删除用户前备份家目录(
tar -czf alice_backup.tar.gz /home/alice
)。
- 删除用户前备份家目录(
5. 其他问题
(1)新创建的用户目录在哪里?
- 默认路径:
在 Ubuntu 中,新用户的目录默认位于/home/用户名
。例如,用户dev01
的家目录是/home/dev01
。 - 例外情况:
若使用useradd
命令时未加-m
参数(如sudo useradd username
),则不会自动创建家目录。需手动创建或通过-m
参数强制生成。
(2)多硬盘服务器如何指定用户目录?
如果服务器挂载了多个硬盘,可以通过以下方式指定用户家目录到其他硬盘分区:
方法一:创建用户时直接指定路径
sudo useradd -m -d /mnt/data/username -s /bin/bash username
-d
:指定家目录路径(需提前创建挂载点,例如/mnt/data
挂载到第二块硬盘)。- 确保目标目录权限正确:
sudo chown username:username /mnt/data/username
方法二:挂载硬盘到 /home
子目录
将第二块硬盘挂载到 /home
的子路径(如 /home2
),然后创建用户时指定路径:
sudo mkdir /home2
sudo mount /dev/sdb1 /home2 # 假设第二块硬盘为 /dev/sdb1
sudo useradd -m -d /home2/username username
方法三:修改现有用户的家目录
sudo usermod -d /new/path/username -m username
-m
参数会将原家目录内容移动到新路径。
总结与操作建议
- 用户目录管理:在多硬盘环境中,建议将用户目录统一挂载到独立分区(如
/data
),便于备份和扩容。 - 权限控制:通过组管理(如
developers
)批量分配权限,而非单独配置用户。 - 安全审计:定期检查
/etc/passwd
和/etc/group
,删除无用账户和组。
示例命令:将第二块硬盘挂载到 /data
并创建用户
# 格式化并挂载硬盘(假设为 /dev/sdb1)
sudo mkfs.ext4 /dev/sdb1
sudo mkdir /data
sudo mount /dev/sdb1 /data
# 创建用户并指定家目录
sudo useradd -m -d /data/dev02 -s /bin/bash dev02
sudo passwd dev02
(3) 新创建的用户默认在哪个组?
- 主组(Primary Group):
Ubuntu 中,新用户默认会创建一个与用户名同名的主组(例如用户dev01
的主组为dev01
)。 - 附加组(Supplementary Groups):
默认情况下,新用户不会自动加入sudo
等特权组,需手动添加(如sudo usermod -aG sudo dev01
)。
(二)组管理
1. 组管理命令详解表
以下为 Linux Ubuntu 系统中 组管理 的核心命令及参数总结,涵盖 创建、删除、修改、查询 等操作,并附有示例与详细解释。
命令 | 参数 | 缩写来源 | 示例 | 示例详细解释 |
---|---|---|---|---|
groupadd | -g | group ID | sudo groupadd -g 1005 developers | 创建组 developers 并指定 GID 为 1005 (避免与系统保留 GID 0-999 冲突)。 |
-r | reserved (system) | sudo groupadd -r system_group | 创建系统组(默认分配 GID < 1000)。 | |
groupmod | -n | new name | sudo groupmod -n new_dev developers | 将组名从 developers 修改为 new_dev (需确保无进程依赖原组名)。 |
-g | group ID | sudo groupmod -g 2000 new_dev | 修改组 new_dev 的 GID 为 2000 (需手动更新文件所属组)。 | |
groupdel | - | 无 | sudo groupdel new_dev | 删除组 new_dev (组必须为空,否则需先移除成员)。 |
gpasswd | -a | add user | sudo gpasswd -a alice developers | 将用户 alice 添加到 developers 组(等同于 usermod -aG )。 |
-d | delete user | sudo gpasswd -d bob developers | 从 developers 组中移除用户 bob 。 | |
-M | Members | sudo gpasswd -M alice,bob,charlie developers | 批量设置 developers 组成员为 alice 、bob 、charlie (覆盖原有成员列表)。 | |
-r | remove password | sudo gpasswd -r developers | 移除组 developers 的密码(若已设置密码认证)。 | |
getent | - | get entries | getent group developers | 查询组 developers 的详细信息(本地组或远程组,如 LDAP/NIS)。 |
groups | - | 无 | groups alice | 显示用户 alice 所属的所有组(主组 + 附加组)。 |
groupmems | -l | list | sudo groupmems -g developers -l | 列出 developers 组的所有成员(需 sudo 权限)。 |
-d | delete | sudo groupmems -g developers -d alice | 从 developers 组中移除用户 alice 。 | |
newgrp | - | new group | newgrp developers | 临时切换当前用户的主组为 developers (需用户属于该组且组密码已设置或无需密码)。 |
cat | - | catenate | cat /etc/group | grep developers | 直接查看 /etc/group 文件中 developers 组的配置信息(仅本地组)。 |
2. 服务器默认组有哪些?
Ubuntu 系统预装的主要默认组及其用途:
组名 | 描述 |
---|---|
root | 超级管理员组,拥有系统完全控制权。 |
sudo | 组成员可通过 sudo 执行特权命令。 |
adm | 允许查看系统日志文件(如 /var/log )。 |
cdrom | 访问光驱设备。 |
dialout | 访问串行端口(如旧式调制解调器)。 |
plugdev | 访问可移动存储设备(如U盘)。 |
lpadmin | 配置打印机。 |
users | 普通用户默认组(部分发行版),Ubuntu 默认不强制用户加入此组。 |
3. 关键操作场景说明
场景一:创建组并添加成员
sudo groupadd -g 1005 developers # 创建组
sudo gpasswd -a alice developers # 添加用户
sudo gpasswd -a bob developers # 添加用户
- 验证:
getent group developers # 输出:developers:x:1005:alice,bob
场景二:批量修改组成员
sudo gpasswd -M alice,charlie developers # 覆盖原有成员
- 结果:
developers
组仅包含alice
和charlie
,原成员bob
被移除。
场景三:删除组
sudo groupdel developers # 删除空组
- 前提:需先移除所有成员(
gpasswd -d
或groupmems -d
)。
场景四:临时切换主组
groups alice # 输出:alice : alice developers
newgrp developers # 切换主组
groups # 输出:alice : developers alice
- 用途:临时以新主组身份创建文件(文件所属组自动设为
developers
)。
4. 配置文件说明
文件 | 作用 |
---|---|
/etc/group | 存储组的基本信息(组名、GID、成员列表)。 |
/etc/gshadow | 存储组密码和管理员列表(仅 root 可读 |