Linux 是一个多用户操作系统,因此每个人或服务都应拥有自己的账户。
useradd 命令在 Linux 中创建新的用户账户,并允许你控制主目录、登录 Shell、组成员身份、UID 和账户过期设置。
本文介绍如何使用 useradd 在 Linux 中创建用户、设置密码,并在创建过程中自定义账户。
了解 Linux 中的用户类型
在 Linux 中,主要有两种类型的用户:
- 普通用户:由管理员创建,是用于标准操作的个人账户。
- 系统用户:由系统或应用程序自动创建,用于运行特定服务。
根据权限级别,普通用户还可以进一步分为:
- 标准用户:访问权限有限,通常用于日常任务。
- 管理用户:具有提升的权限,应仅由受信任的人员使用,因为授予管理权限只有在绝对必要时才应进行。
作为系统管理员,你负责管理系统中的用户和组,包括创建和删除用户,并将其分配到合适的组中。
在本文中,我们将介绍如何使用 useradd 命令创建新的用户账户。
快速参考
如需可打印的快速参考,请参见 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 和组 |
useradd 命令
useradd 是一个命令行工具,用于在 Linux 和 Unix 系统上创建新的用户账户。
useradd 命令的语法为:
useradd [OPTIONS] USERNAME只有 root 用户或具有 sudo 权限的用户才能使用此命令创建新的用户账户。
执行时,useradd 会根据命令行中指定的选项以及 /etc/default/useradd 文件中的默认值创建新的用户账户。
此文件中定义的变量因发行版而异,这也导致 useradd 命令在不同系统上产生不同的结果。
useradd 还会读取 /etc/login.defs 文件的内容。该文件包含影子密码套件的配置,例如密码过期策略、创建系统和普通用户时使用的用户 ID 范围等。
创建新用户
要创建新账户,请运行 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 leahuseradd 还接受 -p(--password)选项,但它期望的是已经加密的字符串,并且手册警告不要将其放在命令行上传递,因为该值对任何列出运行进程的人都是可见的。当你需要在没有交互提示的情况下设置密码时,请将凭据通过管道传递给 chpasswd 代替:
echo 'leah:StrongPassword' | sudo chpasswd在命令行上输入的密码会保留在 Shell 历史记录中,并且在进程列表中可见。在脚本中,应从通过 .gitignore 排除的文件或密钥管理器中读取密码,而不是硬编码。创建带主目录的用户
主目录是多用户操作系统中包含用户文件的目录,也称为登录目录。
在许多 Linux 发行版中,创建用户账户时不会自动创建主目录。
要创建主目录,请使用 -m(--create-home)选项:
sudo useradd -m leah上述命令会在 /home/<username> 下创建新用户的主目录,并从 /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创建指定用户 ID 的用户
在 Linux 和类 Unix 操作系统中,用户通过唯一的 UID 和用户名来标识。
用户标识符(UID)是 Linux 系统分配给每个用户的唯一正整数。UID 和其他访问控制策略决定了用户可以对系统资源执行的操作。
默认情况下,创建新用户时,系统会从 login.defs 文件中指定的用户 ID 范围内分配下一个可用的 UID。
调用带有 -u(--uid)选项的 useradd 命令可以创建具有特定 UID 的用户。
例如,要创建一个名为 leah、UID 为 1500 的新用户,可以输入:
sudo useradd -u 1500 leah要验证用户的 UID,请使用 id 命令:
id -u leah1500创建指定组 ID 的用户
Linux 组是用于管理用户账户的组织单元。组的主要目的是为给定资源定义一组权限,例如读取、写入或执行权限,这些权限可以由组内的用户共享。
当 /etc/login.defs 中的 USERGROUPS_ENAB 设置为 yes 时,useradd 会创建一个与用户名同名的组。否则,它会使用 /etc/default/useradd 中通过 GROUP 配置的主组。当你需要创建匹配组而不考虑系统默认设置时,请传递 -U 选项。
-g(--gid)选项允许你创建具有特定初始登录组的用户。你可以指定组名或 GID 编号。组名或 GID 必须已经存在。
以下示例展示了如何创建一个名为 leah 的新用户,并将登录组设置为 users:
sudo useradd -g users leah要验证用户的 GID,请使用 id 命令:
id -gn leah输出users创建用户并分配多个组
在Linux操作系统中,组有两种类型:主组和次要(或补充)组。每个用户只能属于一个主组,并且可以属于零个或多个次要组。
你可以使用 -G(--groups)选项为用户指定一个附加(补充)组列表。
以下命令创建一个名为 ggdoc 的新用户,其主组为 users,次要组为 wheel 和 docker。
sudo useradd -g users -G wheel,docker ggdoc你可以通过输入以下命令检查用户组:
id ggdoc输出uid=1002(ggdoc) gid=100(users) groups=100(users),10(wheel),993(docker)创建具有特定登录Shell的用户
创建新用户时,其登录Shell被设置为 /etc/default/useradd 文件中指定的值。在某些发行版中,默认Shell为 /bin/sh,而在其他发行版中则为 /bin/bash。
-s(--shell)选项允许你指定新用户的登录Shell。
以下示例展示了如何创建一个名为 ggdoc 的新用户,并将 /usr/bin/zsh 作为登录Shell:
sudo useradd -s /usr/bin/zsh ggdoc检查 /etc/passwd 文件中的用户条目以验证用户的登录Shell:
grep ggdoc /etc/passwd输出ggdoc:x:1001:1001::/home/ggdoc:/usr/bin/zsh创建带有自定义注释的用户
用户的全名或联系信息可以作为注释添加。
要为新用户添加简短描述,请使用 -c(--comment)选项。
在以下示例中,我们创建一个名为 ggdoc 的新用户,并将文本字符串“Test User Account”作为注释:
sudo useradd -c "Test User Account" ggdoc该注释保存在 /etc/passwd 文件中:
grep ggdoc /etc/passwd输出ggdoc:x:1001:1001:Test User Account:/home/ggdoc:/bin/sh注释字段也称为 GECOS。
创建具有过期日期的用户
要定义新用户帐户的过期时间,请使用 -e(--expiredate)选项。这对于创建临时帐户非常有用。
日期必须使用 YYYY-MM-DD 格式指定。
例如,要创建一个名为 ggdoc 的新用户帐户,并将过期时间设置为2027年1月22日,你可以运行以下命令:
sudo useradd -e 2027-01-22 ggdoc使用 chage 命令验证用户帐户的过期日期:
sudo chage -l ggdoc输出将类似于以下内容:
输出Last password change : Sep 11, 2026
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)选项创建系统用户帐户。例如,要创建一个名为 ggdoc 的新系统用户,你可以输入:
sudo useradd -r ggdoc系统用户在创建时没有过期日期。它们的UID从 login.defs 文件中指定的系统用户ID范围中选择,这与普通用户使用的范围不同。
useradd 永远不会为系统帐户创建主目录,即使在 login.defs 中启用了 CREATE_HOME 也是如此。当服务需要一个主目录时,请显式传递 -m 选项。
配置用户帐户的默认值
可以使用 -D、--defaults 选项或手动编辑 /etc/default/useradd 文件来查看和更改默认的 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是否已更改:
useradd -D | grep -i shell输出SHELL=/bin/bashuseradd 与 adduser 的比较
useradd 是 Shadow 工具套件中的底层帐户创建命令。大多数Linux发行版都提供该命令,但像 Alpine 这样的极简系统可能需要你安装额外的软件包。Debian 和 Ubuntu 还附带一个单独的 adduser 软件包。其Perl前端在底层调用 useradd、groupadd 和 usermod,并在其上应用 Debian 策略默认值。
实际区别在于每个命令为你做了多少工作:
| 行为 | useradd | Debian 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,登录Shell设置为 /usr/sbin/nologin,并且不设置密码。在较新版本(包括 Ubuntu 24.04)中,主目录默认为 /nonexistent 且不会自动创建。Ubuntu 22.04 则遵循正常的主目录规则。
当服务应具有同名的主组时,请添加 --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中删除用户?
在删除账户前,确认用户名并备份您需要的任何文件。sudo userdel username 删除账户但保留其主目录。sudo userdel -r username 还会永久删除主目录和邮件暂存区。有关详细信息,请参阅userdel指南。