【Linux学习】Ubuntu对用户进行管理

写在前面

为什么要写这篇博客?

小编最近搞了一台小服务器,然后要给同事们用,正常运维这个服务器就是给同事们添加账号,然后设置权限,这样子只是一些简单的操作,如果服务器出问题了,也不知道怎么去解决,所以小编想深入了解一下linux系统,本篇博客就从简单的添加用户开始入手,主要有以下几个问题:

  • 如何添加用户?
  • 用户背添加到哪里?实际的存储路径是啥?添加到组里是什么意思?
  • 组是什么意思?为什么需要组?系统有哪些默认组?
  • 路径中的home、bin等等分别代表什么意思?为什么会有这个的存在?

对用户的操作(增、删、改、查):

  • 增加什么?用户名,用户id,用户密码,用户出生组,用户目录,用户权限等;
  • 删除什么?
  • 修改什么?用户名,用户id,用户密码,用户所在组,用户目录,用户权限等;
  • 查找什么?用户名,用户id,用户密码,用户所在组,用户目录,用户权限等;

思维导图如下:
在这里插入图片描述

【Linux学习】Ubuntu对用户进行管理

在 Linux 系统中,用户管理是维护系统安全和资源分配的核心任务之一。无论是个人电脑还是服务器,合理的用户权限配置可以防止误操作、保护敏感数据,并支持多用户协作。本文将以 Ubuntu 为例,详细介绍用户管理的常用操作,涵盖创建、修改、删除用户,以及用户组和权限配置的技巧。


一、为什么需要用户管理?

  1. 系统安全:不同用户拥有不同权限,避免普通用户执行高危操作。
  2. 资源隔离:限制用户对文件、目录和进程的访问范围。
  3. 多用户协作:服务器环境中,多个用户可能共享同一系统,需独立配置环境。

二、用户管理基础操作

以下表格详细列举了用户与组管理命令的参数、缩写来源、示例及详细解释,涵盖 创建、修改、权限控制、安全策略 等核心操作。

(一)用户管理

1. 用户管理命令表格

以下为 Linux Ubuntu 系统中 用户管理 的核心命令及参数总结,涵盖 创建、删除、修改、权限分配、密码策略 等操作,并附有示例与详细解释。

命令参数缩写来源示例示例详细解释
useradd-mmake home directorysudo useradd -m alice创建用户 alice,并自动生成家目录 /home/alice
-ddirectorysudo useradd -d /data/alice -m alice指定家目录为 /data/alice(需确保目录存在或为空)。
-sshellsudo useradd -s /sbin/nologin alice设置用户默认 Shell 为禁止登录(适用于服务账户)。
-GGroupssudo useradd -G sudo,developers alice创建用户时直接加入 sudodevelopers 组(覆盖原有附加组)。
-uuser IDsudo useradd -u 1500 alice指定用户 UID 为 1500(避免与系统保留 UID 0-999 冲突)。
-eexpire datesudo useradd -e 2024-12-31 alice设置账户过期时间为 2024-12-31,过期后用户无法登录。
adduser(交互式)无缩写(封装工具)sudo adduser alice交互式创建用户:自动生成家目录、提示设置密码,并填写用户信息(全名、电话等)。
usermod-llogin namesudo usermod -l alice_new alice将用户名从 alice 修改为 alice_new(需手动更新家目录名)。
-ddirectorysudo usermod -d /new_home/alice -m alice修改家目录为 /new_home/alice-m 表示迁移原家目录内容。
-ggroupsudo usermod -g developers alice修改用户主组为 developers(需目标组已存在)。
-aGappend Groupssudo usermod -aG docker alice将用户追加到 docker 组(保留原有附加组)。
-LLocksudo usermod -L alice锁定用户账户(禁止登录),在 /etc/shadow 的密码字段前添加 !
-UUnlocksudo usermod -U alice解锁用户账户(需未被其他机制锁定)。
userdel-rremove filessudo userdel -r alice删除用户 alice 及其家目录和邮件池(谨慎操作,数据不可恢复)。
passwd-llocksudo passwd -l alice锁定用户密码(等同于 usermod -L)。
-uunlocksudo passwd -u alice解锁用户密码(需未被其他方式锁定)。
-eexpiresudo passwd -e alice强制用户下次登录时修改密码(适用于首次创建账户后)。
-SStatussudo passwd -S alice显示账户状态:密码设置时间、有效期、警告天数等。
chage-EExpiry datesudo chage -E 2024-12-31 alice设置账户过期时间(与 useradd -e 功能相同)。
-MMax dayssudo chage -M 90 alice密码最长有效期为 90 天,到期后必须修改。
-WWarn dayssudo chage -W 7 alice密码过期前 7 天提醒用户。
-IInactive dayssudo chage -I 5 alice密码过期后,账户宽限期为 5 天,超时后完全锁定。
id-uuser IDid -u alice显示用户 UID(输出 1001)。
-ggroup IDid -g alice显示用户主组 GID(输出 1001)。
-GnGroups namesid -Gn alice显示用户所属的所有组名(输出 alice sudo developers)。
groups-groups alice显示用户主组和附加组(输出 alice : alice sudo developers)。
getent-get entriesgetent 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,用户可能无法正常使用系统功能(如无法运行 lsgrep 等命令)。

(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-datamysql)。
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. 注意事项
  1. 权限最小化
    • 普通用户不应拥有 sudo 权限,除非必要。
    • 服务账户应禁用 Shell(/sbin/nologin)。
  2. 安全审计
    • 定期检查 /etc/passwd/etc/shadow,清理无效账户。
    • 使用 lastlastlog 监控用户登录记录。
  3. 备份数据
    • 删除用户前备份家目录(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-ggroup IDsudo groupadd -g 1005 developers创建组 developers 并指定 GID 为 1005(避免与系统保留 GID 0-999 冲突)。
-rreserved (system)sudo groupadd -r system_group创建系统组(默认分配 GID < 1000)。
groupmod-nnew namesudo groupmod -n new_dev developers将组名从 developers 修改为 new_dev(需确保无进程依赖原组名)。
-ggroup IDsudo groupmod -g 2000 new_dev修改组 new_dev 的 GID 为 2000(需手动更新文件所属组)。
groupdel-sudo groupdel new_dev删除组 new_dev(组必须为空,否则需先移除成员)。
gpasswd-aadd usersudo gpasswd -a alice developers将用户 alice 添加到 developers 组(等同于 usermod -aG)。
-ddelete usersudo gpasswd -d bob developersdevelopers 组中移除用户 bob
-MMemberssudo gpasswd -M alice,bob,charlie developers批量设置 developers 组成员为 alicebobcharlie(覆盖原有成员列表)。
-rremove passwordsudo gpasswd -r developers移除组 developers 的密码(若已设置密码认证)。
getent-get entriesgetent group developers查询组 developers 的详细信息(本地组或远程组,如 LDAP/NIS)。
groups-groups alice显示用户 alice 所属的所有组(主组 + 附加组)。
groupmems-llistsudo groupmems -g developers -l列出 developers 组的所有成员(需 sudo 权限)。
-ddeletesudo groupmems -g developers -d alicedevelopers 组中移除用户 alice
newgrp-new groupnewgrp developers临时切换当前用户的主组为 developers(需用户属于该组且组密码已设置或无需密码)。
cat-catenatecat /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 组仅包含 alicecharlie,原成员 bob 被移除。
场景三:删除组
sudo groupdel developers             # 删除空组
  • 前提:需先移除所有成员(gpasswd -dgroupmems -d)。
场景四:临时切换主组
groups alice                         # 输出:alice : alice developers
newgrp developers                    # 切换主组
groups                               # 输出:alice : developers alice
  • 用途:临时以新主组身份创建文件(文件所属组自动设为 developers)。

4. 配置文件说明
文件作用
/etc/group存储组的基本信息(组名、GID、成员列表)。
/etc/gshadow存储组密码和管理员列表(仅 root 可读&#x