adduser, addgroup - 添加或操作用户或组
概要
adduser [--add-extra-groups] [--allow-all-names] [--allow-bad-names] [--comment comment]
[--conf file] [--debug] [--disabled-login] [--disabled-password] [--firstgid id]
[--firstuid id] [--gid id] [--home dir] [--ingroup group] [--lastgid id] [--lastuid id]
[--no-create-home] [--no-copy-skel] [--shell shell] [--quiet] [--uid id] [--verbose]
[--stdoutmsglevel prio] [--stderrmsglevel prio] [--logmsglevel prio] user
adduser --system [--comment comment] [--conf file] [--debug] [--gid id] [--group] [--home dir]
[--ingroup group] [--no-create-home] [--no-copy-skel] [--shell shell] [--uid id]
[--quiet] [--verbose] [--stdoutmsglevel prio] [--stderrmsglevel prio]
[--logmsglevel prio] user
adduser --group [--conf file] [--debug] [--firstgid id] [--gid ID] [--lastgid id] [--quiet]
[--verbose] [--stdoutmsglevel prio] [--stderrmsglevel prio] [--logmsglevel prio] group
addgroup [--conf file] [--debug] [--firstgid id] [--gid ID] [--lastgid id] [--quiet] [--verbose]
[--stdoutmsglevel prio] [--stderrmsglevel prio] [--logmsglevel prio] group
addgroup --system [--gid id] [--conf file] [--quiet] [--verbose] [--stdoutmsglevel prio]
[--stderrmsglevel prio] [--logmsglevel prio] group
adduser [--conf file] [--debug] [--quiet] [--verbose] [--stdoutmsglevel prio]
[--stderrmsglevel prio] [--logmsglevel prio] user group
adduser --help
adduser --version
描述
adduser 和 addgroup 根据命令行选项以及 /etc/adduser.conf 中的配置信息,将用户和组添加到系统中。它们是 useradd、groupadd 和 usermod 程序的 Debian 特定的前端程序,这些程序更具分发平台无关性。adduser 和 addgroup 默认选择符合 Debian 策略的 UID 和 GID 值,创建一个带有骨架配置的家目录,运行自定义脚本,并具有其他功能。
adduser 和 addgroup 旨在作为一个策略层,使软件包维护者和本地管理员更容易创建符合 Debian 期望的本地系统帐户,从而减轻了适应 Debian 策略可能变化的负担。 adduser --system 只需要在软件包维护者的脚本中进行一次调用,而无需任何条件包装、错误抑制或其他支架。
adduser 遵守 Debian 策略第 9.2.2 章中记录的动态分配系统用户和组与动态分配用户帐户之间的区别。
有关完整列表和所有选项的说明,请参阅“选项”部分。
adduser 和 addgroup 可以以以下五种模式之一运行:
添加普通(非系统)用户
如果使用一个非选项参数调用,且没有使用 --system 或 --group 选项,adduser 将添加一个普通用户,这意味着在 Debian 策略中定义的动态分配的用户帐户。在 adduser 中,这通常被称为非系统用户。
adduser 将从配置文件中 FIRST_UID 和 LAST_UID 中指定的范围内选择可用的第一个 UID。可以使用 --firstuid 和 --lastuid 选项覆盖此范围。最后,可以使用 --uid 选项完全手动设置 UID。
默认情况下,每个用户都会获得一个具有相同名称的相应组。这通常称为用户组,允许通过将适当的用户放入新组,并在目录中设置设置组 ID 位,并确保所有用户都使用 umask 002,来轻松维护组可写的目录。
对于用户组,adduser 将从配置文件中 FIRST_GID 和 LAST_GID 中指定的范围内选择可用的第一个 GID。可以使用 --firstgid 和 --lastgid 选项覆盖此范围。最后,可以使用 --gid 选项完全手动设置 GID。
USERS_GID、USERS_GROUP 和 USERGROUPS 之间的交互关系在 adduser.conf(5) 中详细说明。
可以使用 --gid 或 --ingroup 选项从命令行覆盖新用户的默认主组,分别按 ID 或名称设置组。此外,用户可以添加到配置文件中定义的 EXTRA_GROUPS 中的一个或多个辅助组,方法是将 ADD_EXTRA_GROUPS 设置为 1,或通过命令行传递 --add-extra-groups。
adduser 会将文件从 /etc/skel 复制到主目录,并提示输入“注释”字段和密码(如果这些功能未被禁用/从命令行覆盖)。
可以使用 UID_POOL 和 GID_POOL 选项预先确定 UID、注释、主目录和 shell,具体内容在 adduser.conf(5) 中有记录。
添加系统用户
如果使用一个非选项参数调用,并且使用 --system 选项,adduser 将添加一个动态分配的系统用户,在 adduser 软件包的上下文中,这通常缩写为系统用户。
adduser 将从配置文件中 FIRST_SYSTEM_UID 和 LAST_SYSTEM_UID 中指定的范围内选择可用的第一个 UID。这可以使用 --uid 选项覆盖。
默认情况下,系统用户会被分配 nogroup 作为主组。要分配一个已存在的组作为主组,请使用 --gid 或 --ingroup 选项。如果提供了 --group 选项,并且同名的组不存在,则会使用相同的 ID 创建该组。
如果没有指定主目录,则新系统用户的默认主目录为 /nonexistent。此目录在任何 Debian 系统上都不应存在,并且 adduser 也不会自动创建它。
如果使用 --home 选项指定了主目录,并且该目录已经存在(例如,如果软件包中包含该目录中的文件),adduser 命令不会静默地将该目录的所有者设置为新创建的用户。设置所有者可能会覆盖本地管理员的决定,并且报告这一事实会破坏 adduser 在软件包安装期间的静默性。如果您在软件包的维护脚本中使用 adduser --home,您可能需要在调用 adduser 之后显式地对主目录执行递归 chown 操作。
除非使用 --shell 选项显式地设置了 shell,否则新系统用户的 shell 将设置为 /usr/sbin/nologin。adduser --system 命令不会为新帐户设置密码。如果对一个已经设置了密码的帐户调用 adduser --system,则会出错。不会复制骨架配置文件。
其他选项的行为与创建普通用户时一样。UID_POOL 和 GID_POOL 中引用的文件也将被使用。
添加一个组
如果调用 adduser 命令时使用 --group 选项且未使用 --system 选项,或者分别调用 addgroup 命令,则会添加一个用户组。
如果调用 adduser --group 或 addgroup 命令并使用 --system 选项,则会创建一个动态分配的系统组,在 adduser 包的上下文中,通常简称为系统组。
将从配置文件中为 GID 指定的相应范围内选择一个 GID(FIRST_GID、LAST_GID、FIRST_SYSTEM_GID、LAST_SYSTEM_GID)。要覆盖该机制,可以使用 --gid 选项指定 GID。
对于非系统组,可以使用 --firstgid 和 --lastgid 选项来覆盖配置文件中指定的范围。
该组将创建,并且没有任何成员。
将现有用户添加到现有组
如果调用时带有两个非选项参数,adduser 命令会将现有用户添加到现有组。
选项
^ dduser 的不同模式允许使用不同的选项。如果某个选项没有为任何有效的模式列出,则它将在所有模式中被接受。
某些选项可能存在简短的版本,这是历史原因。它们将继续受到支持,但将从文档中删除。建议用户迁移到选项的完整版本。
--add-extra-groups
将新用户添加到配置文件中 EXTRA_GROUPS 设置中定义的额外组。旧拼写 --add_extra_groups 已弃用,并且仅在 Debian bookworm 中支持。有效模式:adduser、adduser --system。
--allow-all-names
允许使用底层 useradd(8) 支持的任何用户名和组名。请参见“有效名称”部分。有效模式:adduser、adduser --system、addgroup、addgroup --system。
--allow-bad-names
禁用对名称进行 NAME_REGEX 和 SYS_NAME_REGEX 检查。仅会对名称进行较弱的有效性检查。请参见“有效名称”部分。有效模式:adduser、adduser --system、addgroup、addgroup --system。
--comment comment
设置新条目生成的注释字段。如果提供了此选项,adduser 将不会提示输入此信息。此字段也称为 GECOS 字段,其中包含 finger(1) 命令使用的信息。以前的选项是 --gecos,它已被弃用,并且将在 Debian bookworm 之后删除。有效模式:adduser、adduser --system。
--conf file
使用 file 代替 /etc/adduser.conf。可以提供多个 --conf 选项。
--debug
与 --stdoutmsglevel=debug 同义。已弃用。
--disabled-login
--disabled-password
不运行 [passwd]({filename}../../passwd)(1) 来设置密码。在大多数情况下,登录仍然是可能的(例如,使用 SSH 密钥或通过 PAM),原因超出了 adduser 的范围。--disabled-login 还会将 shell 设置为 /usr/sbin/nologin。有效模式:adduser。
--firstuid ID
--lastuid ID
--firstgid ID
--lastgid ID
覆盖在配置文件的 uid 范围中选择的第一个 UID / 最后一个 UID / 第一个 GID / 最后一个 GID(FIRST\_UID、LAST\_UID、FIRST\_GID 和 LAST\_GID、FIRST\_SYSTEM\_UID、LAST\_SYSTEM\_UID、FIRST\_SYSTEM\_GID 和 LAST\_SYSTEM\_GID)。如果以用户组身份创建组,则 --firstgid 和 --lastgid 将被忽略。该组将获得与用户相同的 ID。有效模式:adduser、adduser --system,对于 --firstgid 和 --lastgid,还包括 addgroup。
--force-badname
--allow-badname
这些是 --allow-bad-names 的已弃用形式。它们将在 Debian 13 的发布周期中删除。
--gid GID
创建组时,此选项将新组的组 ID 编号设置为 GID。创建用户时,此选项将新用户的基本组 ID 编号设置为 GID。有效模式:adduser、adduser --system、addgroup、addgroup --system。
--group
在 adduser --system 中使用此选项表示新用户应获得一个与其同名的组作为其主组。如果该同名组尚未存在,则会创建它。如果不与 --system 组合,则会创建一个具有给定名称的组。后者是程序作为 addgroup 调用时的默认操作。有效模式:adduser --system、addgroup、addgroup --system。
--help 显示简要说明。
--home dir
使用 dir 作为用户的家目录,而不是配置文件的默认值(或者如果使用 adduser --system,则为 /nonexistent)。如果该目录不存在,则会创建它。有效模式:adduser、adduser --system。
--ingroup GROUP
创建用户时,此选项将新用户的基本组 ID 编号设置为命名组的 GID。与使用 --gid 选项不同,组在此处通过名称而不是数字 ID 编号指定。该组必须已经存在。有效模式:adduser、adduser --system。
--lastuid ID
--lastgid ID
覆盖上次的 UID/GID。请参阅 --firstuid。
--no-create-home
不要为新用户创建主目录。请注意,新用户的主目录的路径仍然会输入到 /etc/passwd 文件中的相应字段中。使用此选项并不意味着应该将此字段留空。相反,它指示 adduser,其他机制将负责初始化新用户的主目录。有效模式:adduser、adduser --system。
--no-copy-skel
不要将 /etc/skel 中的文件复制到新用户的主目录中。如果主目录是新创建的,它将为空。有效模式:adduser、adduser --system。
--quiet
与 --stdoutmsglevel=warn 同义。已弃用。
--shell shell
使用 shell 作为用户的登录 shell,而不是配置文件中指定的默认 shell(或者,如果使用 adduser --system,则使用 /usr/sbin/nologin)。有效模式:adduser、adduser --system。
--system
通常,adduser 会创建动态分配的用户帐户和组,如 Debian 策略第 9.2.2 章中所定义。使用此选项,adduser 会创建一个动态分配的系统用户和组,并相应地更改其模式。有效模式:adduser、addgroup。
--uid ID
强制将新的用户 ID 设置为给定的数字。如果该用户 ID 已经被占用,adduser 将会失败。有效模式:adduser、adduser --system。
--verbose
与 --stdoutmsglevel=info 同义。已弃用。
--stdoutmsglevel prio
--stderrmsglevel prio
--logmsglevel prio
将消息记录到 syslog/journal 和控制台的最小优先级。值包括 trace、debug、info、warn、err 和 fatal。优先级设置为此处或更高的消息将打印到相应的媒体。打印到 stderr 的消息不会在 stdout 上重复。这允许本地管理员独立控制 adduser 在控制台上和日志中的详细程度,同时保留有用的信息,避免显示可能令人困惑的信息。stdoutmsglevel、stderrmsglevel 和 logmsglevel 的默认值分别为 warn、warn 和 info。
-v , --version
显示版本和版权信息。
有效名称
从历史上看,adduser(8) 和 addgroup(8) 强制符合 IEEE Std 1003.1-2001,该标准允许以下字符出现在组名和用户名中:字母、数字、下划线、句点、at 符号 (@) 和连字符。名称不能以连字符或 @ 开头。美元符号 ($) 允许出现在用户名的末尾,以允许典型的 Samba 机器帐户。
NAME_REGEX 和 SYS_NAME_REGEX 的默认设置允许用户名包含字母和数字,以及连字符 (-) 和下划线 (_); 名称必须以字母开头(或系统用户以下划线开头)。
最宽松的策略,可以通过使用 --allow-all-names 选项来实现,只是进行与 useradd(8) 相同的检查。请注意,useradd 的检查在 Debian 13 中变得更加严格。
更改默认行为可能会导致创建令人困惑或具有误导性的名称;请谨慎使用。
记录日志
^ dduser 使用广泛且可配置的日志记录功能,以根据系统管理员的需求调整其详细程度。
^ dduser 打印的每个消息都由作者分配了一个优先级值。此优先级无法在运行时更改。可用的优先级值包括 crit、error、warning、info、debug 和 trace。
如果您发现某个消息的优先级不正确,请提交错误报告。
每次生成消息时,代码都会决定是将消息打印到标准输出、标准错误还是系统日志。这主要由配置设置 STDOUTMSGLEVEL、STDERRMSGLEVEL 和 LOGMSGLEVEL 独立控制。为了测试目的,这些设置可以在命令行中被覆盖。
只有优先级高于或等于相应消息级别的消息才会被记录到相应的输出介质。已写入标准错误的消息不会第二次写入标准输出。
退出值
0 成功:指定的用户或组已存在。这可能有两种原因:该用户或组是本次调用 `adduser` 创建的,或者在调用 `adduser` 之前,该用户或组已存在于系统中。如果调用 `adduser --system` 命令来创建一个用户,而该用户已存在且具有请求的或兼容的属性,它也会返回 0。
11 要创建的对象已经存在。
12 要创建的对象不存在。
13 要操作的对象不具有完成操作所需的属性:请求创建为系统用户的用户(或组)已存在,但不是系统用户(或组);或者,请求创建为具有特定 UID(GID)的用户(或组)已存在,并且具有不同的 UID(GID);或者,请求删除的系统用户(或组)确实存在,但不是系统用户(或组)。
21 为新用户(或组)显式请求的 UID(GID)已被使用。
22 在请求的范围内没有可用的 UID(GID)。
23 没有具有请求的 GID 的组作为新用户的基本组。
31 为新用户或新组选择的名称不符合所选的命名规则。
32 新用户的家目录必须是绝对路径。
33 `useradd` 返回退出代码 19“无效用户或组名”。这意味着所选的用户或组名不符合 `useradd` 的限制,并且 `adduser` 无法创建用户。
41 请求删除的组不为空。
42 请求要从组中删除的用户根本不是该组的成员。
43 无法从主组中删除用户,或者无法为新用户通过任何方式选择主组。
51 检测到命令行参数的数量或顺序不正确。
52 配置文件中设置了不兼容的选项。
53 检测到相互不兼容的命令行选项。
54 adduser 和 deluser 作为非 root 用户调用,因此无法正常工作。
55 deluser 将拒绝删除 root 帐户。
56 请求的功能需要安装更多软件包。请参阅 adduser 软件包的“Recommends:”和“Suggests:”。
61 adduser 因某种原因被中止,并尝试撤销执行期间所做的更改。
62 adduser 内部错误。这不应该发生。请尝试重现该问题并提交错误报告。
71 创建和处理锁时出错。
72 无法访问配置文件。
73 无法访问池文件。
74 读取池文件时出错,文件存在语法错误。
75 无法访问辅助文件。
81 adduser 或 deluser 所需的可执行文件找不到。请检查您的安装和依赖项。
82 执行外部命令时返回了意外错误。
83 外部命令被信号终止。
84 系统调用以意外的错误终止。
或者,对于许多其他尚未记录的原因,这些原因会打印到控制台。您可以考虑增加日志级别,以使 adduser 更加详细。
安全性
adduser 需要 root 权限,并且通过 --conf 命令行选项提供使用不同配置文件的功能。不要使用 [sudo]({filename}../../sudo)(8) 或类似的工具向 adduser 提供具有受限命令行参数的部分权限。这样做很容易被绕过,并且可能允许用户创建任意帐户。如果您希望这样做,请考虑编写您自己的包装脚本,并授予执行该脚本的权限。
文件
/etc/adduser.conf
adduser(8) 和 addgroup(8) 的默认配置文件。
/usr/local/sbin/adduser.local
可选的自定义附加组件,请参阅 adduser.local(8)。
注意事项
不幸的是,Debian 中的“系统帐户”一词存在双重含义。它既指用于实际 Debian 系统的帐户,又与可能存在于 Debian 上运行的某些应用程序的用户数据库中的应用程序帐户区分开。在这种定义中,系统帐户可以登录到实际系统,具有 UID,可以成为系统组的成员,可以拥有文件和进程。与此相反,Debian 策略的第 9.2.2 章区分了动态分配的系统用户和组以及动态分配的用户帐户,这意味着在两种情况下都是系统帐户的特殊实例。必须小心不要混淆这些术语。由于 adduser 和 deluser(8) 从不处理应用程序帐户,并且此软件包中的所有内容都与系统帐户相关,因此在软件包的上下文中,用户帐户和系统帐户这两个术语实际上没有歧义。为了清楚起见,如果需要与应用程序帐户或在目录服务中管理的帐户区分开,则本文档使用“本地系统帐户”或“组”一词。
adduser 曾经设想成为 Debian 中用于创建和删除普通用户和系统帐户的各种目录服务的通用前端,这一设想可以追溯到 1990 年代。 截至 2022 年,这个设想已被放弃。 其背后的原因是:在实践中,小型服务器系统不太可能具有对企业级目录服务的写入访问权限,本地安装的软件包难以与集中控制的系统帐户进行管理,企业目录服务本身也具有自己的管理流程,并且 adduser 团队的人力资源不太可能足以编写和维护支持大量所需的目录服务。
adduser 将限制其功能,仅作为本地系统帐户管理的策略层,并使用 passwd 软件包中的工具来执行实际操作。
错误
文档和代码中对“系统帐户”一词的使用不一致,这是一个错误。 请报告此问题,以便我们改进文档。
adduser 特别注重使其可以直接在 Debian 维护脚本中使用,而无需使用条件包装器、错误抑制和其他辅助代码。 包维护人员需要编写的唯一内容是在 postrm 脚本中检查可执行文件的存在。 adduser 维护人员认为,需要额外的辅助代码是一种错误,并鼓励其他 Debian 包维护人员在这种情况下向 adduser 包提交错误报告。
参阅
adduser.conf(5)、deluser(8)、groupadd(8)、useradd(8)、usermod(8)、任何 Debian 系统上的 /usr/share/doc/basepasswd/users-and-groups.html、Debian 策略 9.2.2、RFC8264“PRECIS 框架:应用程序协议中国际化字符串的准备、执行和比较”、RFC8265“PRECIS:表示用户名和密码”,https://wiki.debian.org/UserAccounts。