@lxbwolf
This commit is contained in:
Xingyu Wang 2020-01-06 22:58:24 +08:00
parent e710bad796
commit b72910f7ce

View File

@ -1,6 +1,6 @@
[#]: collector: (lujun9972) [#]: collector: (lujun9972)
[#]: translator: (lxbwolf) [#]: translator: (lxbwolf)
[#]: reviewer: ( ) [#]: reviewer: (wxy)
[#]: publisher: ( ) [#]: publisher: ( )
[#]: url: ( ) [#]: url: ( )
[#]: subject: (Intro to the Linux useradd command) [#]: subject: (Intro to the Linux useradd command)
@ -9,8 +9,10 @@
Linux useradd 命令介绍 Linux useradd 命令介绍
====== ======
使用 useradd 命令来添加用户(并且根据需要修改账号)。
![people in different locations who are part of the same team][1] > 使用 useradd 命令来添加用户(并且根据需要修改账号)。
![](https://img.linux.net.cn/data/attachment/album/202001/06/225733hv1u7f4z4vbt8u5x.jpg)
任何计算机系统中,添加用户都是最重要的事之一;本文着重介绍如何在 Linux 系统中添加用户。 任何计算机系统中,添加用户都是最重要的事之一;本文着重介绍如何在 Linux 系统中添加用户。
@ -29,21 +31,21 @@ $ file `which adduser`
### 默认处理 ### 默认处理
`useradd` 的基本用法相当简单:通过一个用户名就可以添加一个用户 `useradd` 的基本用法相当简单:提供一个用户名就可以添加一个用户。
```bash ```bash
$ sudo useradd sonny $ sudo useradd sonny
``` ```
在本例中,`useradd` 命令创建了一个名为 *sonny* 的账号。此命令同时创建了一个同名的组,*sonny* 被放进了这个组,这个组也是 *sonny* 账号的主组。命令执行时,根据配置文件 `/etc/default/useradd``/etc/login.defs` 中的不同设置,也会有其他的参数处理,如语言和 shell。对于一个私人系统或微小的单服务商业环境这些参数已经足够了。 在本例中,`useradd` 命令创建了一个名为 `sonny` 的账号。此命令同时创建了一个同名的组,`sonny` 被放进了这个组,这个组也是 `sonny` 账号的主组。命令执行时,根据配置文件 `/etc/default/useradd``/etc/login.defs` 中的不同设置,也会有其他的参数,如语言和 shell。对于一个私人系统或微小的单服务商业环境这些参数已经足够了。
上面两个文件控制 `useradd` 的处理,用户的信息保存在 `/etc` 目录下的一些其他文件中,关于这些信息的讲解会贯穿全文。 上面两个文件控制 `useradd` 的处理,用户的信息保存在 `/etc` 目录下的一些其他文件中,关于这些信息的讲解会贯穿全文。
| 文件 | 描述 | 域 (加粗的表示由 useradd 命令设置) | | 文件 | 描述 | 域 (加粗的表示由 useradd 命令设置) |
| ------ | ------------------------------------ | ------------------------------------------------------------ | | ------ | ------------------------------------ | ------------------------------------------------------------ |
| passwd | Stores user account details | **username**:unused:**uid**:**gid**:**comment**:**homedir**:**shell** | | `passwd` | 存储用户账号信息 | 用户名:未使用:UID:GID:备注:家目录:shell |
| shadow | Stores user account security details | **username**:password:lastchange:minimum:maximum:warn:**inactive**:**expire**:unused | | `shadow` | 存储用户账号的安全信息 | 用户名:加密密码:上次修改时间:最短使用天数:最长使用天数间:修改前警示天数:过期后宽限时间:未使用 |
| group | Stores group details | **groupname**:unused:**gid**:**members** | | `group` | 存储组信息 | 组名:未使用:GID:成员列表 |
### 自定义处理 ### 自定义处理
@ -51,35 +53,35 @@ $ sudo useradd sonny
#### 用户和组 ID #### 用户和组 ID
`useradd` 默认主组 IDGID与用户 IDUID相同,但也不完全是。虽然 UID 与 GID 相同不是必须的,但如果相同,会更方便管理员管理。 默认情况下,`useradd` 试图使用相同的用户 IDUID和主组 IDGID,但也不完全是。虽然 UID 与 GID 相同不是必须的,但如果相同,会更方便管理员管理。
下面的场景就是一个 GID 与 UID 不同的 例子。现在我添加另一账号,名为 Timmy。通过使用 `getent` 命令来比较 *sonny**timmy* 两个账号,显示两个用户和对应的主组。 下面的场景就是一个 GID 与 UID 不同的例子。现在我添加另一账号,名为 Timmy。通过使用 `getent` 命令来比较 `sonny``timmy` 两个账号,显示两个用户和对应的主组。
```bash ```bash
$ getent passwd sonny timmy $ getent passwd sonny timmy
sonny1001:1002:Sonny:/home/sonny:/bin/bash sonny:x:1001:1002:Sonny:/home/sonny:/bin/bash
timmy1002:1003::/home/timmy:/bin/bash timmy:x:1002:1003::/home/timmy:/bin/bash
$ getent group sonny timmy $ getent group sonny timmy
sonny1002: sonny:x:1002:
timmy1003: timmy:x:1003:
``` ```
不幸的是,两者的 UID 和 GID 都不相同。因为默认的处理是,创建用户时,把下一个可用的 UID 赋给用户,然后把同一个数字作为主组 ID 赋给它。然而,当要使用的 ID 已经被使用时,就再把下一个可用的 GID 赋给它。为了弄清细节,我猜想 1001 这个 GID 已经被使用了,用一个命令确认了一下。 不幸的是,两者的 UID 和 GID 都不相同。因为默认的处理是,创建用户时,把下一个可用的 UID 赋给用户,然后把同一个数字作为主组 ID 赋给它。然而,当要使用的 ID 已经被使用时,就再把下一个可用的 GID 赋给它。为了弄清细节,我猜想 1001 这个 GID 已经被使用了,用一个命令确认了一下。
```bash ```bash
$ getent group 1001 $ getent group 1001
book1001:alan book:x:1001:alan
``` ```
*book* 的 ID 是 *1001*,因此新创建的用户的 GID 都有偏移量 1。这就是为什么系统管理员在用户创建过程中需要多设置一些值的一个实例。为了解决这个问题我必须先确定下一个可用的 UID 和 GID 是否相同。确定下一个可用值时,可以使用 `getent group``getent passwd` 命令,通过 `-u` 参数传递要确认的值。 `book` 的 ID 是 `1001`,因此新创建的用户的 GID 都有偏移量 1。这就是为什么系统管理员在用户创建过程中需要多设置一些值的一个实例。为了解决这个问题我必须先确定下一个可用的 UID 和 GID 是否相同。确定下一个可用值时,可以使用 `getent group``getent passwd` 命令,通过 `-u` 参数传递要确认的值。
```bash ```bash
$ sudo useradd -u 1004 bobby $ sudo useradd -u 1004 bobby
$ getent passwd bobby; getent group bobby $ getent passwd bobby; getent group bobby
bobby1004:1004::/home/bobby:/bin/bash bobby:x:1004:1004::/home/bobby:/bin/bash
bobby1004: bobby:x:1004:
``` ```
另一个需要指定 ID 的场景是,通过 NFS 访问远程系统上的文件时。对于一个给定的用户,当 NFS 所有客户端和服务系统的 ID 都一样时,管理员更容易控制。在我的文章 [使用 autofs 挂载 NFS][2] 中有详细介绍。 另一个需要指定 ID 的场景是,通过 NFS 访问远程系统上的文件时。对于一个给定的用户,当 NFS 所有客户端和服务系统的 ID 都一样时,管理员更容易控制。在我的文章 [使用 autofs 挂载 NFS][2] 中有详细介绍。
@ -95,12 +97,12 @@ bobby❌1004:
```bash ```bash
$ sudo useradd -c "Bailey is cool" bailey $ sudo useradd -c "Bailey is cool" bailey
$ getent passwd bailey $ getent passwd bailey
bailey1011:1011:Bailey is cool:/home/bailey:/bin/bash bailey:x:1011:1011:Bailey is cool:/home/bailey:/bin/bash
``` ```
#### 组 #### 组
一个用户可以被指定一个主组和多个次组。 `-g` 参数指定主组名称或 GID。如果不指定`useradd` 会以用户名创建一个主组(前面演示过)。`-G`(大写)参数用一个逗号分隔的组列表来指定此用户所属的组,这些组就是次组。 一个用户可以被指定一个主组和多个次组。`-g` 参数指定主组名称或 GID。如果不指定`useradd` 会以用户名创建一个主组(前面演示过)。`-G`(大写)参数用一个逗号分隔的组列表来指定此用户所属的组,这些组就是次组。
```bash ```bash
$ sudo useradd -G tgroup,fgroup,libvirt milly $ sudo useradd -G tgroup,fgroup,libvirt milly
@ -110,12 +112,12 @@ uid=1012(milly) gid=1012(milly) groups=1012(milly),981(libvirt),4000(fgroup),300
#### 家目录 #### 家目录
`useradd` 的默认处理是,在 `/home` 目录下创建用户的家目录。然而,下面的参数可以改写家目录的 base 目录。`-b` 设置另一个可以创建家目录的 base 目录。例如 指定 `/home2` 而不是 `/home` `useradd` 的默认处理是,在 `/home` 目录下创建用户的家目录。然而,下面的参数可以改写家目录的基础目录。`-b` 设置另一个可以创建家目录的基础目录。例如指定 `/home2` 而不是 `/home`
```bash ```bash
$ sudo useradd -b /home2 vicky $ sudo useradd -b /home2 vicky
$ getent passwd vicky $ getent passwd vicky
vicky1013:1013::/home2/vicky:/bin/bash vicky:x:1013:1013::/home2/vicky:/bin/bash
``` ```
`-d` 参数可以指定一个与用户名不同的家目录。 `-d` 参数可以指定一个与用户名不同的家目录。
@ -123,24 +125,23 @@ vicky❌1013:1013::/home2/vicky:/bin/bash
```bash ```bash
$ sudo useradd -d /home/ben jerry $ sudo useradd -d /home/ben jerry
$ getent passwd jerry $ getent passwd jerry
jerry1014:1014::/home/ben:/bin/bash jerry:x:1014:1014::/home/ben:/bin/bash
``` ```
#### skeleton 目录 #### 目录模板
`-k` 参数指定创建新用户时,会复制 `/etc/skel` 目录下的所有文件到家目录中。这些文件通常是 shell 配置文件,当然也可以是系统管理员想在新建用户时使用的任何文件。 指定 `-k` 参数会在创建新用户时,复制 `/etc/skel` 目录下的所有文件到用户的家目录中。这些文件通常是 shell 配置文件,当然也可以是系统管理员想在新建用户时使用的任何文件。
#### Shell #### Shell
`-s` 参数可以指定 shell。如果不指定则使用默认的 shell。例如下面的例子中 ,配置文件中定义的 shell 是 `bash`,但 `Wally` 这个用户指定的是 `zsh` `-s` 参数可以指定 shell。如果不指定则使用默认的 shell。例如下面的例子中 ,配置文件中定义的 shell 是 `bash`,但 `wally` 这个用户指定的是 `zsh`
```bash ```bash
$ grep SHELL /etc/default/useradd
SHELL=/bin/bash SHELL=/bin/bash
$ sudo useradd -s /usr/bin/zsh wally $ sudo useradd -s /usr/bin/zsh wally
$ getent passwd wally $ getent passwd wally
wally1004:1004::/home/wally:/usr/bin/zsh wally:x:1004:1004::/home/wally:/usr/bin/zsh
``` ```
#### 安全 #### 安全
@ -153,7 +154,7 @@ $ sudo getent shadow sammy
sammy:!!:18171:0:99999:7::20191231: sammy:!!:18171:0:99999:7::20191231:
``` ```
当密码过期时,一个账号也可以自动失效。`-f` 参数指定密码过期后经过几天账号失效。如果设为 0则立即失效。 当密码过期时,账号也会自动失效。`-f` 参数指定密码过期后经过几天账号失效。如果设为 0则立即失效。
```bash ```bash
$ sudo useradd -f 30 willy $ sudo useradd -f 30 willy
@ -163,7 +164,7 @@ willy:!!:18171:0:99999:7:30::
### 实例 ### 实例
生产中,创建一个用户账号时会用到多个参数。例如,我要创建一个 Perry 账号,可能会用下面的命令: 生产环境中,创建一个用户账号时会用到多个参数。例如,我要创建一个 Perry 账号,可能会用下面的命令:
```bash ```bash
$ sudo useradd -u 1020 -c "Perry Example" \ $ sudo useradd -u 1020 -c "Perry Example" \
@ -176,8 +177,8 @@ $ sudo useradd -u 1020 -c "Perry Example" \
```bash ```bash
$ getent passwd perry; getent group perry; getent shadow perry; id perry $ getent passwd perry; getent group perry; getent shadow perry; id perry
perry1020:1020:Perry Example:/home2/perry:/usr/bin/zsh perry:x:1020:1020:Perry Example:/home2/perry:/usr/bin/zsh
perry1020: perry:x:1020:
perry:!!:18171:0:99999:7:5:20201201: perry:!!:18171:0:99999:7:5:20201201:
uid=1020(perry) gid=1020(perry) groups=1020(perry),3000(tgroup) uid=1020(perry) gid=1020(perry) groups=1020(perry),3000(tgroup)
``` ```
@ -192,8 +193,8 @@ via: https://opensource.com/article/19/10/linux-useradd-command
作者:[Alan Formy-Duval][a] 作者:[Alan Formy-Duval][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[译者ID](https://github.com/译者ID) 译者:[lxbwolf](https://github.com/lxbwolf)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出