# 管理用户

在Linux中，每个普通用户都有一个账户，包括用户名、密码和主目录等信息。除此之外，还有一些系统本身创建的特殊用户，它们具有特殊的意义，其中最重要的是管理员账户，默认用户名是root。同时Linux也提供了用户组，使每一个用户至少属于一个组，从而便于权限管理。

用户和用户组管理是系统安全管理的重要组成部分，本章主要介绍openEuler提供的用户管理和组管理命令，以及为普通用户分配特权的方法。

<!-- TOC -->

- [管理用户](#管理用户)
    - [管理用户](#管理用户-1)
        - [增加用户](#增加用户)
        - [修改用户账号](#修改用户账号)
        - [删除用户](#删除用户)
        - [管理员账户授权](#管理员账户授权)
    - [管理用户组](#管理用户组)
        - [增加用户组](#增加用户组)
        - [修改用户组](#修改用户组)
        - [删除用户组](#删除用户组)
        - [将用户加入用户组或从用户组中移除](#将用户加入用户组或从用户组中移除)
        - [切换用户组](#切换用户组)

<!-- /TOC -->

## 管理用户

### 增加用户

#### useradd命令

在root权限下，通过useradd命令可以为系统添加新用户信息，其中  _options_  为相关参数， _username_  为用户名称。

```
useradd [options] username
```

#### 用户信息文件

与用户账号信息有关的文件如下：

-   /etc/passwd：用户账号信息文件。
-   /etc/shadow：用户账号信息加密文件。
-   /etc/group：组信息文件。
-   /etc/default/useradd：定义默认设置文件。
-   /etc/login.defs：系统广义设置文件。
-   /etc/skel：默认的初始配置文件目录。

#### 创建用户实例

例如新建一个用户名为userexample的用户，在root权限下执行如下命令：

```
# useradd userexample
```

>![](public_sys-resources/icon-note.gif) **说明：**   
>没有任何提示，表明用户建立成功。这时并没有设置用户的口令，请使用passwd命令修改用户的密码，没有设置密码的新账号不能登录系统。  


使用id命令查看新建的用户信息，命令如下：

```
# id userexample
uid=502(userexample)    gid=502(userexample)    groups=502(userexample)
```

修改用户userexample的密码：

```
# passwd userexample
```

修改用户密码时需要满足密码复杂度要求，密码的复杂度的要求如下：

1.  口令长度至少8个字符。
2.  口令至少包含大写字母、小写字母、数字和特殊字符中的任意3种。
3.  口令不能和账号一样。
4.  口令不能使用字典词汇。
    -   查询字典
        在已装好的openEuler环境中，可以通过如下命令导出字典库文件dictionary.txt，用户可以查询密码是否在该字典中。
        ```
        cracklib-unpacker /usr/share/cracklib/pw_dict > dictionary.txt
        ```
    -   修改字典
        1.  修改上面导出的字典文件，执行如下命令更新系统字典库。
            ```
            # create-cracklib-dict dictionary.txt
            ```
        2.  在原字典库基础上新增其他字典内容custom.txt。
            ```
            # create-cracklib-dict dictionary.txt custom.txt
            ```


根据提示两次输入新用户的密码，完成密码更改。过程如下：

```
# passwd userexample
Changing password for user userexample.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
```

>![](public_sys-resources/icon-note.gif) **说明：**   
>若打印信息中出现“BAD PASSWORD: The password fails the dictionary check - it is too simplistic/sytematic”，表示设置的密码过于简单，建议设置复杂度较高的密码。  

### 修改用户账号

#### 修改密码

普通用户可以用passwd修改自己的密码，只有管理员才能用passwd username为其他用户修改密码。

#### 修改用户shell设置

使用chsh命令可以修改自己的shell，只有管理员才能用chsh username为其他用户修改shell设置。

用户也可以使用usermod命令修改shell信息，在root权限下执行如下命令，其中  _new\_shell\_path_  为目标shell路径，_username_  为要修改用户的用户名，请根据实际情况修改：

```
usermod -s new_shell_path username
```

例如，将用户userexample的shell改为csh，命令如下：

```
# usermod -s /bin/csh userexample
```

#### 修改主目录

-   修改主目录，可以在root权限下执行如下命令，其中  _new\_home\_directory_  为已创建的目标主目录的路径，_username_  为要修改用户的用户名，请根据实际情况修改：

    ```
    usermod -d new_home_directory username
    ```

-   如果想将现有主目录的内容转移到新的目录，应该使用-m选项，命令如下：

    ```
    usermod -d new_home_directory -m username
    ```


#### 修改UID

修改用户ID，在root权限下执行如下命令，其中  _UID_  代表目标用户ID，_username_  代表用户名，请根据实际情况修改：

```
usermod -u UID username
```

该用户主目录中所拥有的文件和目录都将自动修改UID设置。但是，对于主目录外所拥有的文件，只能使用chown命令手动修改所有权。

#### 修改账号的有效期

如果使用了影子口令，则可以在root权限下，执行如下命令来修改一个账号的有效期，其中  _MM_  代表月份，_DD_  代表某天，_YY_  代表年份，_username_  代表用户名，请根据实际情况修改：

```
usermod -e MM/DD/YY username
```

### 删除用户

在root权限下，使用userdel命令可删除现有用户。

例如，删除用户Test，命令如下：

```
# userdel Test
```

如果想同时删除该用户的主目录以及其中所有内容，要使用-r参数递归删除。

>![](public_sys-resources/icon-note.gif) **说明：**   
>不建议直接删除已经进入系统的用户，如果需要强制删除，请使用 userdel -f  _Test_  命令。  

### 管理员账户授权

使用sudo命令可以允许普通用户执行管理员账户才能执行的命令。

sudo命令允许已经在/etc/sudoers文件中指定的用户运行管理员账户命令。例如，一个已经获得许可的普通用户可以运行如下命令：

```
sudo /usr/sbin/useradd newuserl
```

实际上，sudo的配置完全可以指定某个已经列入/etc/sudoers文件的普通用户可以做什么，不可以做什么。

/etc/sudoers的配置行如下所示。

-   空行或注释行（以\#字符打头）：无具体功能的行。
-   可选的主机别名行：用来创建主机列表的简称。必须以Host\_Alias关键词开头，列表中的主机必须用逗号隔开，如：

    ```
    Host_Alias  linux=ted1,ted2
    ```

    其中ted1和ted2是两个主机名，可使用linux（别名）称呼它们。


-   可选的用户别名行：用来创建用户列表的简称。用户别名行必须以User\_Alias关键词开头，列表中的用户名必须以逗号隔开。其格式同主机别名行。
-   可选的命令别名行：用来创建命令列表的简称。必须以Cmnd\_Alias开头，列表中的命令必须用逗号隔开。
-   可选的运行方式别名行：用来创建用户列表的简称。不同的是，使用这样的别名可以告诉sudo程序以列表中某一用户的身份来运行程序。
-   必要的用户访问说明行。

    用户访问的说明语法如下：

    ```
    user host = [ run as user ] command list
    ```

    在user处指定一个真正的用户名或定义过的别名，host也可以是一个真正的主机名或者定义过的主机别名。默认情况下，sudo执行的所有命令都是以root身份执行。如果您想使用其他身份可以指定。command list可以是以逗号分隔的命令列表，也可以是一个已经定义过的别名，如：

    ```
    ted1   ted2=/sbin/shutdown
    ```

    这一句说明ted1可以在ted2主机上运行关机命令。

    ```
    newuser1 ted1=(root) /usr/sbin/useradd,/usr/sbin/userdel
    ```

    这一句说明ted1主机上的newuser1具有以root用户权限执行useradd，userdel命令的功能。

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >-   可以在一行定义多个别名，中间用冒号 \(:\) 隔开。  
    >-   可在命令或命令别名之前加上感叹号 \(!\)，使该命令或命令别名无效。  
    >-   有两个关键词：ALL和NOPASSWD。ALL意味着“所有”（所有文件、所有主机或所有命令），NOPASSWD意味着不用密码。  
    >-   通过修改用户访问，将普通用户的访问权限修改为同root一样，则可以给普通用户分配特权。  


下面是一个sudoers文件的例子：

```
#sudoers files
#User alias specification
User_Alias ADMIN=ted1:POWERUSER=globus,ted2
#user privilege specification
ADMIN ALL=ALL
POWERUSER ALL=ALL,!/bin/su
```

其中：

-   User\_Alias ADMIN=ted1:POWERUSER=globus,ted2

    定义了两个别名ADMIN和POWERUSER

-   ADMIN ALL=ALL

    说明在所有主机上，ADMIN用户都可以以root身份执行所有命令

-   POWERUSER ALL=ALL,!/bin/su

    给POWERUSER用户除了运行su命令外等同ADMIN的权限

## 管理用户组

### 增加用户组

#### groupadd命令

在root权限下，通过groupadd命令可以为系统添加新用户组信息，其中  _options_  为相关参数， _groupname_ 为用户组名称。

```
groupadd [options] groupname
```

#### 用户组信息文件

与用户组信息有关的文件如下：

-   /etc/gshadow：用户组信息加密文件。
-   /etc/group：组信息文件。
-   /etc/login.defs：系统广义设置文件。

#### 创建用户组实例

例如新建一个用户组名为groupexample的用户，在root权限下执行如下命令：

```
# groupadd groupexample
```

### 修改用户组

#### 修改GID

修改用户组ID，在root权限下执行如下命令，其中 _GID_ 代表目标用户组ID， _groupname_ 代表用户组，请根据实际情况修改：

```
groupmod -g GID groupname
```


#### 修改用户组名

修改用户组名，在root权限下执行如下命令，其中 _newgroupname_ 代表新用户组名， _oldgroupname_ 代表已经存在的待修改的用户组名，请根据实际情况修改：

```
groupmod -n newgroupname oldgroupname
```

### 删除用户组

在root权限下，使用groupdel命令可删除用户组。

例如，删除用户组Test，命令如下：

```
# groupdel Test
```

>![](public_sys-resources/icon-note.gif) **说明：**   
>groupdel不能直接删除用户的主组，如果需要强制删除用户主组，请使用 groupdel -f  _Test_  命令。  

### 将用户加入用户组或从用户组中移除

在root权限下，使用gpasswd命令将用户加入用户组或从用户组中移除。

例如，将用户 _userexample_ 加入用户组 _Test_ ，命令如下：

```
# gpasswd -a userexample Test
```
例如，将用户 _userexample_ 从 _Test_ 用户组中移除，命令如下：

```
# gpasswd -d userexample Test
```

### 切换用户组

一个用户同时属于多个用户组时，则在用户登录后，使用newgrp命令可以切换到其他用户组，以便具有其他用户组的权限。

例如，将用户 _userexample_ 切换到 _Test_ 用户组，命令如下：

```
$ newgrp Test
```


