在 Linux 中使用 useradd 创建用户

Linux 是一个多用户操作系统,因此每个用户或服务都应拥有各自的账户。

useradd 命令用于在 Linux 中创建新用户账户,并允许你控制主目录、登录 Shell、所属组、UID 以及账户过期设置。

本文讲解如何在 Linux 中使用 useradd 创建用户、设置密码,并在创建过程中对账户进行定制。

理解 Linux 中的用户类型

在 Linux 中,用户主要分为两类:

  • 普通用户:由管理员创建,是供标准操作使用的个人账号。
  • 系统用户:由系统或应用程序自动创建,用于运行特定服务。

按权限级别划分,普通用户还可进一步分为:

  • 标准用户:权限有限,通常用于日常任务。
  • 管理用户:拥有较高权限,应由可信人员担任;授予管理权限应只在确有必要时进行。

作为系统管理员,你的职责是管理系统中的用户和组:创建和删除用户,并将其分配到合适的组中。

本文将介绍如何使用 useradd 命令创建新用户账户。

快速参考

命令说明
sudo useradd username用默认设置创建用户
sudo useradd -m username创建用户并创建主目录
sudo useradd -m -s /bin/bash username创建用户并指定登录 Shell
sudo useradd -m -G sudo username创建用户并加入附加组
sudo useradd -U username创建用户并创建同名组
sudo passwd username设置或重置用户密码
sudo adduser username在 Debian 和 Ubuntu 上交互式创建用户
sudo useradd -D显示 useradd 默认设置
id username验证 UID、GID 和所属组
sudo userdel -r username删除用户及其主目录

如需可打印的快速参考,请查看 useradd 速查表。

useradd 命令

useradd 是一个命令行工具,用于在 Linux 和 Unix 系统上创建新用户账户。

useradd 命令的语法如下:

useradd [OPTIONS] USERNAME

只有 root 用户或拥有 sudo 权限的用户才能用该命令创建新账户。

执行时,useradd 会根据命令行指定的选项以及 /etc/default/useradd 文件中的默认值来创建新用户账户。

该文件中定义的变量因发行版而异,这导致 useradd 命令在不同系统上产生的结果也不尽相同。

useradd 还会读取 /etc/login.defs 文件的内容。该文件包含 shadow 密码套件的配置,例如密码过期策略、创建系统用户和普通用户时使用的 UID 范围等。

创建新用户

要创建新账户,运行 useradd 命令并在其后跟上用户名。

例如,要创建一个名为 leah 的新用户,可运行以下命令:

sudo useradd leah

账户会立即被创建,但在你用 passwd 设置密码之前,该用户无法登录。

提示:不带任何选项执行时,useradd 会使用 /etc/default/useradd 文件中指定的默认设置创建新用户账户。

该命令会在 /etc/passwd、/etc/shadow、/etc/group 和 /etc/gshadow 文件中各添加一条记录。

你可以运行 id 命令来验证账户已创建并查看用户的详细信息:

id leah
uid=1005(leah) gid=1005(leah) groups=1005(leah)

设置用户密码

要让新用户能够登录,需要为其设置密码。可执行 passwd 命令并在其后跟上用户名:

sudo passwd leah

该命令会提示你输入并确认新密码。请确保使用强密码。

Changing password for user leah.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

创建账户和设置密码是两个独立步骤,但可以将它们串在一起,使密码提示紧随其后出现:

sudo useradd -m -s /bin/bash leah && sudo passwd leah

useradd 也支持 -p(--password)选项,但它要求传入已加密的字符串,且手册明确警告不要将其写在命令行上,因为该值对正在列出进程的任何人都可见。若需要在非交互情况下设置密码,改用管道把凭据传给 chpasswd:

echo 'leah:StrongPassword' | sudo chpasswd
警告:在命令行上输入的密码会进入你的 Shell 历史记录,并出现在进程列表中。在脚本中,应从通过 .gitignore 排除的文件中读取,或从密钥管理器中获取,而不是硬编码。

创建带主目录的用户

主目录(home directory)是多用户操作系统中存放用户文件的目录,也称登录目录。

在许多 Linux 发行版中,创建用户账户时并不会自动创建主目录。

要创建主目录,使用 -m(--create-home)选项:

sudo useradd -m leah

上述命令会在 /home/ 创建新用户的主目录,并从 /etc/skel 复制默认的初始化文件。

如果列出 /home/leah 目录中的文件,你会看到以下内容:

ls -la /home/leah/
total 20
drwxr-x--- 2 leah leah 4096 Dec 20 17:58 .
drwxr-xr-x 4 root root 4096 Dec 20 17:58 ..
-rw-r--r-- 1 leah leah  220 Jan  6  2025 .bash_logout
-rw-r--r-- 1 leah leah 3771 Jan  6  2025 .bashrc
-rw-r--r-- 1 leah leah  807 Jan  6  2025 .profile

用户可以在主目录中写入、编辑和删除文件及目录。

创建指定主目录的用户

要创建拥有指定主目录的用户,使用 -d(--home)选项。

下面演示如何创建一个名为 leah、主目录为 /opt/leah 的新用户:

sudo useradd -m -d /opt/leah leah

创建指定 UID 的用户

在 Linux 和类 Unix 系统中,用户通过唯一的 UID 和用户名来标识。

用户标识符(UID)是 Linux 系统为每个用户分配的唯一正整数。UID 及其他访问控制策略决定了用户能对系统资源执行的操作。

默认情况下,创建新用户时,系统会从 login.defs 文件指定的 UID 范围中取下一个可用值分配给该用户。

若要创建拥有指定 UID 的用户,可在 useradd 命令中使用 -u(--uid)选项。

例如,要创建一个名为 leah、UID 为 1500 的新用户,可输入:

sudo useradd -u 1500 leah

要验证用户的 UID,使用 id 命令:

id -u leah
1500

创建指定 GID 的用户

Linux 组是用于管理用户账户的组织单元。组的主要目的是为某项资源定义一组权限(如读、写或执行权限),这些权限可在组内用户之间共享。

创建新用户时,useradd 的默认行为是创建一个与用户名同名、GID 与 UID 相同的组。

-g(--gid)选项允许你创建拥有指定初始登录组的用户。可以指定组名或 GID 数字,但该组名或 GID 必须已存在。

下面的例子演示如何创建名为 leah 的新用户,并将登录组设为 users:

sudo useradd -g users leah

要验证用户的 GID,使用 id 命令:

id -gn leah
users

创建用户并分配多个组

Linux 系统中有两类组:主组(Primary)和附加组(Secondary 或 supplementary)。每个用户只能属于一个主组,但可属于零个或多个附加组。

可以使用 -G(--groups)选项为用户指定一组附加(supplementary)组。

下面的命令创建名为 zoe 的新用户,其主组为 users,附加组为 wheel 和 docker。

sudo useradd -g users -G wheel,docker zoe

可通过以下命令查看用户所属组:

id zoe
uid=1002(zoe) gid=100(users) groups=100(users),10(wheel),993(docker)

创建指定登录 Shell 的用户

创建新用户时,其登录 Shell 会被设为 /etc/default/useradd 文件中指定的那个。在某些发行版中默认 Shell 是 /bin/sh,而在另一些发行版中是 /bin/bash。

-s(--shell)选项允许你指定新用户的登录 Shell。

下面演示如何创建一个名为 zoe、以 /usr/bin/zsh 作为登录 Shell 的新用户:

sudo useradd -s /usr/bin/zsh zoe

检查 /etc/passwd 文件中的用户条目以验证登录 Shell:

grep zoe /etc/passwd
zoe:x:1001:1001::/home/zoe:/usr/bin/zsh

创建带自定义注释的用户

用户的全名或联系信息可作为注释添加。

要为新建用户添加简短描述,使用 -c(--comment)选项。

在下面的例子中,我们创建一个名为 zoe 的新用户,并以 “Test User Account” 作为注释:

sudo useradd -c "Test User Account" zoe

注释会保存在 /etc/passwd 文件中:

grep zoe /etc/passwd
zoe:x:1001:1001:Test User Account:/home/zoe:/bin/sh

该注释字段也称为 GECOS。

创建带过期日期的用户

要为新建用户账户定义过期时间,使用 -e(--expiredate)选项。这对创建临时账户很有用。

日期必须使用 YYYY-MM-DD 格式指定。

例如,要创建一个名为 zoe、过期时间设为 2027 年 1 月 22 日的新用户账户,可运行:

sudo useradd -e 2027-01-22 zoe

使用 chage 命令验证用户账户的过期日期:

sudo chage -l zoe

输出类似如下:

Last password change				: Dec 11, 2023
Password expires				: never
Password inactive				: never
Account expires					: Jan 22, 2027
Minimum number of days between password change	: 0
Maximum number of days between password change	: 99999
Number of days of warning before password expires	: 7

创建系统用户

系统用户通常在操作系统和软件包安装期间创建,它们与普通用户在技术层面并没有真正区别。

使用 -r(--system)选项创建系统用户账户。例如,要创建一个名为 zoe 的新系统用户,可输入:

sudo useradd -r zoe

系统用户创建时没有过期日期。其 UID 取自 login.defs 文件中指定的系统 UID 范围,该范围与普通用户使用的范围不同。

即使 login.defs 中启用了 CREATE_HOME,useradd 也绝不会为系统账户创建主目录。若服务需要主目录,请显式传入 -m。

配置用户账户的默认值

可以使用 -D(--defaults)选项查看和修改 useradd 的默认值,也可以手动编辑 /etc/default/useradd 文件。

要查看当前的默认选项,输入:

useradd -D

输出类似如下:

GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

假设你想把默认登录 Shell 从 /bin/sh 改为 /bin/bash,可按如下方式指定新 Shell:

sudo useradd -D -s /bin/bash

可通过运行以下命令验证默认 Shell 已更改:

sudo useradd -D | grep -i shell
SHELL=/bin/bash

useradd 与 adduser 的区别

useradd 是 Shadow 工具套件中的底层账户创建命令。大多数 Linux 发行版都提供它,不过像 Alpine 这类精简系统可能需要额外安装软件包。Debian 和 Ubuntu 还附带一个独立的 adduser 软件包,其 Perl 前端在底层调用 useradd、groupadd 和 usermod,并叠加 Debian 策略默认值。

两者的实际差别在于每条命令为你做了多少工作:

行为useraddDebian adduser
可用平台大多数发行版(有时需额外安装软件包)Debian、Ubuntu 及其衍生版
主目录需加 -m 或启用 CREATE_HOME 才创建从 /etc/skel 创建并填充
密码不设置,账户保持锁定交互式提示输入
全名与联系字段仅在使用 -c 时添加交互式提示输入
用途直接、非交互式地创建账户交互式管理以及 Debian 软件包脚本

在 Debian 和 Ubuntu 上,一次 adduser 调用即可替代「useradd + passwd」的组合:

sudo adduser leah

该命令会创建账户和 /home/leah,从 /etc/skel 复制骨架文件,然后提示你输入密码以及可选的全名和联系信息字段。

--system 选项会选择系统 UID 范围,并一次性修改多个默认值。若不指定组选项,主组为 nogroup,主目录默认为 /nonexistent,登录 Shell 设为 /usr/sbin/nologin,且不设置密码。

若服务应有同名主组,可加上 --group:

sudo adduser --system --group backup-agent

该命令同时创建 backup-agent 系统用户及其主组。其他发行版提供的 adduser 命令可能选项不同。在 Fedora、RHEL 及其衍生版上,应使用 useradd 与上文中明确的选项来创建账户。

故障排查

出现 useradd: user 'username' already exists(用户名已存在):该用户名已被占用。请换一个名称,或用 id username 查看已有账户。若要修改现有用户,请改用 usermod。

出现 useradd: Permission denied(权限被拒绝):创建用户需要 root 权限。请在命令前加 sudo,或先切换到 root 用户。

主目录未被创建:默认情况下,useradd 并非在所有发行版上都会创建主目录。请始终传入 -m 标志以确保主目录被创建:sudo useradd -m username。

创建后用户无法登录:新创建的用户默认未设置密码,账户会被锁定。请在用户登录前运行 sudo passwd username 设置密码。

出现 specified group does not exist(指定的组不存在):使用 -g 或 -G 时,组必须已存在。请先用 sudo groupadd groupname 创建组,再重试 useradd 命令。

常见问题

useradd 和 adduser 有什么区别?useradd 是大多数发行版提供的底层 Shadow 工具,而 Debian 和 Ubuntu 附带一个独立的交互式 adduser 前端,会自动创建主目录并提示输入密码。其他发行版的 adduser 实现可能不同。上文中「useradd 与 adduser 的区别」一节对两者做了对比。

如何在 Linux 中创建带主目录的用户?使用 -m 标志:sudo useradd -m username。这会在 /home/username 创建主目录,并从 /etc/skel 复制默认文件。

如何创建用户的同时将其加入某个组?使用 -G 标志指定附加组:sudo useradd -m -G sudo,docker username。该用户除主组外,还将是所有所列组的成员。

如何验证用户已成功创建?运行 id username 检查用户的 UID、GID 和所属组。也可以用 grep username /etc/passwd 查看 /etc/passwd 中的记录。

如何在 Linux 中删除用户?使用 userdel 命令。若要同时删除主目录,加上 -r 标志:sudo userdel -r username。详见 userdel 指南。

结语

useradd 命令覆盖了从基础账户创建到自定义 UID、组分配、登录 Shell 和过期日期的一切。在 Debian 和 Ubuntu 上,adduser 负责常见的交互式配置,而 useradd 让你可以直接控制每个账户选项。关于各发行版的具体操作,请参阅《在 Debian 13 上添加和删除用户》一文。