)
Linux 用户管理知识与应用实践本章将深入讲解用户管理的知识并带领小伙伴们实践 Linux 运维中有关用户管理的工作。三、添加用户命令 useradd1、useradd 命令的工作原理Linux 系统中添加用户的命令有useradd和adduser这两个命令的功能是一样的。除了 useradd 和 adduser 命令以外还可以通过修改用户配置文件/etc/passwd 和 /etc/group 等文件的办法来直接添加用户但不推荐使用该方法。还是推荐统一使用 useradd 命令添加用户本节也仅以 useradd 命令为例讲解添加用户的知识。A. useradd 命令的工作原理当不带任何参数使用 useradd 命令添加用户时首先会读取配置文件 /etc/login.defs 和 etc/default/useradd 中预先定义的规则并根据设置的规则添加用户同时还会向 /etc/passwd 和 /etc/group 文件内添加新建的用户和用户组记录。当然/etc/shadow 和 /etc/gshadow 也会同步生成记录同时系统还会根据 /etc/default/useradd及 /etc/login.defs 文件中配置的信息建立用户的家目录并复制 /etc/skel 中所有隐藏的环境配置文件到新用户的家目录中以完成对用户环境的初始化设置。B. 与创建用户相关的文件 /etc/login.defs/etc/login.defs文件的作用是预先定义创建用户时需要的一些用户默认配置信息。如创建用户时是否需要家目录以及 UID 和 GID 的取值起始值及取值范围用户及密码的有效期限等完整功能请参见下文配置文件中的注释说明。[rootshy ~]# cat /etc/login.defs ... 省略注释内容 ... # *REQUIRED* # Directory where mailboxes reside, _or_ name of file, relative to the # home directory. If you _do_ define both, MAIL_DIR takes precedence. # QMAIL_DIR is for Qmail # #QMAIL_DIR Maildir MAIL_DIR /var/spool/mail # 设定用户对应的 mail 文件所在的路径。 #MAIL_FILE .mail # Password aging controls: ... 省略注释内容 ... PASS_MAX_DAYS 99999 # 密码最长可以使用的天数。 PASS_MIN_DAYS 0 # 更换密码的最小天数。 PASS_MIN_LEN 5 # 密码的最小长度。 PASS_WARN_AGE 7 # 密码失效之前提前多少天开始警告。 # # Min/max values for automatic uid selection in useradd # UID_MIN 1000 # 默认最小 UID 为 1000即添加用户时UID 是从 1000 开始的。 UID_MAX 60000 # 默认最大值。 # System accounts SYS_UID_MIN 201 SYS_UID_MAX 999 # # Min/max values for automatic gid selection in groupadd # GID_MIN 1000 # 默认最小 GID 为 1000即添加用户时GID 是从 1000 开始的。 GID_MAX 60000 # 默认最大值。 # System accounts SYS_GID_MIN 201 SYS_GID_MAX 999 # # If defined, this command is run when removing a user. # It should remove any at/cron/print jobs etc. owned by # the user to be removed (passed as the first argument). # #USERDEL_CMD /usr/sbin/userdel_local # 删除用户时删除与用户相关的所有工作默认关闭。 # # If useradd should create home directories for users by default # On RH systems, we do. This option is overridden with the -m flag on # useradd command line. # CREATE_HOME yes # 是否创建用户家目录默认要求创建可以用 -m 参数进行控制。 # The permission mask is initialized to this value. If not specified, # the permission mask will be initialized to 022. UMASK 077 # 家目录对应 umask 默认值。 # This enables userdel to remove user groups if no members exist. # USERGROUPS_ENAB yes # 删除用户同时删除用户组如果用户组没有其他成员则删除。 # Use SHA512 to encrypt password. ENCRYPT_METHOD SHA512 # 密码加密算法 SHA512。C. 与创建用户相关的文件 /etc/default/useradd/etc/default/useradd文件是在使用 useradd 添加用户时预先加载的默认用户信息配置文件可以使用 “useradd -D” 修改此文件的配置实践见后文当然也可以直接使用 vim 编辑器来修改文件里面的内容下面就来看看它的内容具体如下[rootshy ~]# cat /etc/default/useradd # useradd defaults file GROUP100 # 依赖于 /etc/login.defs 的 USERGROUPS_ENAB 参数如果为 no则此处控制。 HOME/home # 在 /home 目录下创建用户的家目录。 INACTIVE-1 # 是否启用用户过期停权-1 表示不启用。 EXPIRE # 用户终止日期不设置表示不启用。 SHELL/bin/bash # 新用户默认使用的 Shell 解释器类型。 SKEL/etc/skel # 配置新用户家目录的默认环境变量文件的存放路径。当使用 useradd 添加用户时用户家 目录下的隐藏环境变量文件都是从这里配置的 /etc/skel 目录中复制过去的。 CREATE_MAIL_SPOOLyes # 创建 mail 文件。D. 与创建用户相关的目录 /etc/skel/etc/skel目录是用来存放新用户需要的所有基础环境变量文件的目录当添加新用户时这个目录下的所有文件都会被自动复制到新添加的用户的家目录下默认情况下/etc/skel目录下的所有文件都是隐藏文件以点号开头的文件通过修改、添加、删除/etc/skel目录下的环境变量文件可为新创建的用户提供统一的、标准的、定制化的初始化用户环境。[rootshy ~]# ls -la /etc/skel/ 总用量 24 drwxr-xr-x. 2 root root 62 2月 28 13:57 . drwxr-xr-x. 87 root root 8192 5月 27 12:12 .. -rw-r--r--. 1 root root 18 11月 25 2021 .bash_logout # 用户环境变量文件退出时加载。 -rw-r--r--. 1 root root 193 11月 25 2021 .bash_profile # 用户环境变量文件登录时加载。 -rw-r--r--. 1 root root 231 11月 25 2021 .bashrc # 用户环境变量文件登录时加载。范例14 -1使用 oldboy 用户登录到 Linux 系统后发现提示符为如下所示的异常情况请问如何恢复到正常的 Linux 命令行提示符情况-bash-4.1$ -bash-4.1$解答首先模拟故障重现步骤如下[rootshy ~]# su - oldboy # 切换到 oldboy 用户下 [oldboyshy ~]$ rm -f .bash* # 故障原因是用户家目录下的环境变量不存在了。 [oldboyshy ~]$ logout # 按快捷键CtrlD退出当前环境。 [rootshy ~]# su - oldboy # 重新切换到 oldboy 用户下。 上一次登录日 6月 14 11:14:12 CST 2026pts/0 上 -bash-4.2$ # 可以看到故障重现了。方法一常用方法-bash-4.2$ cp /etc/skel/.bash* ~/ # 从 /etc/skel 中将所有环境变量文件复制回来注意当前用户 -bash-4.2$ logout [rootshy ~]# su - oldboy # 重新切换到 oldboy 用户下 上一次登录日 6月 14 11:16:34 CST 2026pts/0 上 [oldboyshy ~]$ # 故障已排除方法二仅适用于临时情况执行export PS1[\u\h \W]\$ PS1 是控制 Linux 命令提示符的环境变量。E. 有关创建用户的工作原理总结当不添加任何参数使用 useradd 添加用户时默认配置就是读取/etc/default/useradd信息并根据该文件的信息设定用户。这时会从/etc/skel中复制用户需要的环境变量文件同时还会读取/etc/login.defs并根据该文件设定相关的默认信息。这是一个用户在创建过程中的实现过程当然了还可以加上参数选项以改 变文件中的默认设定。2、useradd 命令的常用参数介绍表 14-8 useradd 命令常用参数一览表3、useradd 添加用户命令的应用实践范例14-2不加任何参数添加用户 alex。[rootshy ~]# useradd alex # 添加用户 alex [rootshy ~]# ls -ld /home/alex/ # 在 /home 下增加了以 alex 为目录的家目录。 drwx------ 2 alex alex 62 6月 14 11:43 /home/alex/ # 权限是 700/etc/login.defs 中设定的。 [rootshy ~]# ls -al /home/alex/ 总用量 12 drwx------ 2 alex alex 62 6月 14 11:43 . drwxr-xr-x. 9 root root 136 6月 14 11:43 .. -rw-r--r-- 1 alex alex 18 11月 25 2021 .bash_logout # 用户环境变量文件来自 /etc/skel。 -rw-r--r-- 1 alex alex 193 11月 25 2021 .bash_profile # 用户环境变量文件来自 /etc/skel。 -rw-r--r-- 1 alex alex 231 11月 25 2021 .bashrc # 用户环境变量文件来自 /etc/skel。 [rootshy ~]# grep -w alex /etc/passwd # 查看用户生成情况。 alex:x:1007:1008::/home/alex:/bin/bash 需要提醒的是在添加用户 alex 的同时还会添加与用户名相同的用户组 alex。 [rootshy ~]# tail -l /etc/group # 查看用户组的生成情况。 alex:x:1008: [rootshy ~]# tail -l /etc/shadow # 还会在 shadow 里记录用户组的信息。 alex:!!:20618:0:99999:7::: [rootshy ~]# tail -l /etc/gshadow # 还会在 gshadow 里记录用户组的信息。 alex:!::在这个例子中我们添加了一个名为 alex 的系统用户并且在 “/home/” 目录下自动生成了名字为 alex 的家目录并且权限是 700。在 /etc/passwd 文件里从对应 alex 的用户行还可以看到 UID 和 GID 以及登录解释器等设置信息前面已经介绍过这方面的知识了 因此对于这么多的默认设置并不感到奇怪。至此可以得出一个结论使用 useradd 添加用户时涉及的核心文件有/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow其他文件还有/etc/login.defs、/etc/default/useradd涉及的目录包括/etc/skel、/home。范例14-3useradd 的 -g、-u 参数的使用示例。创建用户 zuma属于指定组 rootUID 为 888实现步骤具体如下[rootshy ~]# useradd zuma -u 888 -g root # 创建用户 zuma属于指定组 rootUID 为 888。 [rootshy ~]# id zuma # 查看生效信息。 uid888(zuma) gid0(root) 组0(root)范例14-4useradd 的 -M、-s 参数的使用示例。创建一个虚拟用户 mysql禁止其登录且不创建家目录实现步骤如下[rootshy ~]# useradd mysql -s /sbin/nologin -M [rootshy ~]# tail -l /etc/passwd mysql:x:1008:1009::/home/mysql:/sbin/nologin注意这个例子比较具有代表性在生产场景部署网络服务时经常会用到。范例14-5useradd 的 -e 参数的使用示例。在本例中我们主要是练习下 -e 参数的使用这个参数的作用是设定用户到什么时候过期。在生产场景中员工离职或者一些临时有需求的用户或者对时间有限制的一些用户可能会需要这个选项下面的示例代码会实现添加用户 pig 的操作用户有效期 1 个月实现步骤如下[rootshy ~]# date %F # 查看系统当前日期。 2026-06-14 [rootshy ~]# useradd pig -e 2026/07/14 # 设置用户过期时间一个月后过期。 [rootshy ~]# chage -l pig # 查看过期的设置结果。 最近一次密码修改时间 6月 14, 2026 密码过期时间 从不 密码失效时间 从不 帐户过期时间 7月 14, 2026 两次改变密码之间相距的最小天数 0 两次改变密码之间相距的最大天数 99999 在密码过期之前警告的天数 7这样当日期过了 2026 年 7 月 14 日之后再使用 pig 登录就会出现如下无法登录的提示或者直接就是无法连接Your account has expired; please contact your system administrator范例14-6useradd -c、-u、-G、-s、-d -m 多个参数组合的示例。描述如下添加用户 oldboyedu并设置其用户注释信息为 good trainingUID 指定为 806分别属于用户组 root、oldboy、 sa 的成员其 Shell 解释器类型为 /bin/sh设置家目录为 /home/luffy。实际操作步骤及结果具体如下[rootshy ~]# useradd -c good training -u 806 -G root,oldboy,sa -s /bin/sh -d /home/luffy oldboyedu [rootshy ~]# tail -l /etc/passwd # passwd 里增加了 oldboyedu 用户记录。 oldboyedu:x:806:1012:good training:/home/luffy:/bin/sh [rootshy ~]# id oldboyedu # 查询 UID 和 GID 以及所归属的用户组。 uid806(oldboyedu) gid1012(oldboyedu) 组1012(oldboyedu),0(root),1003(sa),1011(oldboy) [rootshy ~]# ls -ld /home/luffy # 家目录 drwx------ 2 oldboyedu oldboyedu 62 6月 14 12:36 /home/luffy4、useradd -D 的特殊用法useradd -D 的作用是改变配置文件/etc/default/useradd文件的默认设置值。当然这样的修改操作也可以通过命令编辑器来实现比如直接修改/etc/default/useradd文件更新预设值。表 14-9 useradd -D 后可接的参数表范例14-7设置添加用户时的默认解释器类型为/sbin/nologin。[rootshy ~]# cat /etc/shells # 查看当前系统支持的 Shell 解释器种类 /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash [rootshy ~]# grep -w SHELL /etc/default/useradd # 查看 /etc/default/useradd 解释器配置 SHELL/bin/bash [rootshy ~]# useradd -D -s /sbin/nologin # 修改默认解释器 [rootshy ~]# grep -w SHELL /etc/default/useradd # 查看修改结果 SHELL/sbin/nologin [rootshy ~]# useradd newuser # 这里不加参数添加用户 [rootshy ~]# grep newuser /etc/passwd newuser:x:1010:1013::/home/newuser:/sbin/nologin # 解释器默认变成 /sbin/nologin [rootshy ~]# useradd -D -s /bin/bash # 测试完毕后改回原默认状态以防止后面的测试出错 [rootshy ~]# grep -w SHELL /etc/default/useradd SHELL/bin/bash关于这个 -D 参数的讲解就到这里。如果还不会使用那么可直接修改/etc/default/useradd参数配置文件 Linux 系统中解决问题的方式是很灵活的读者可以选择简单、方便、适合自己掌握的方式 但是思路必须要清晰。四、用户信息修改命令 usermodusermod 命令能更改用户的解释器类型、UID、家目录等以及更改用户的有效期、登录名等很多与用户有关的信息。1、usermod 命令语法和常用参数usermod [options] [login] usermod [选项] [用户名]usermod 用于修改用户而 useradd 用于添加用户本质上都是对用户进行操作因此这两个命令大部分的参数作用都是一样的。表 14-10 usermod 常用参数说明2、usermod 命令实践范例14-8usermod 命令 -c、-u、-G、-s、-d 多参数组合的示例。这里对 useradd 实践的范例14-6 中创建的用户进行修改。修改 oldboy 用户属性将注释说明改为 goodUID改为 996 所属的附加组改为 sa同时禁止其登录家目录改为 /home/oldboy。实际操作步骤及结果具体如下[rootshy ~]# usermod -c good -u 996 -G sa -s /sbin/nologin -d /home/oldboy oldboy # 修改用户信息将说明改为goodUID改为996所属的附加组改为sa禁止登录家目录改为 #/home/oldboy。 [rootshy ~]# tail -l /etc/passwd oldboy:x:996:1004:good:/home/oldboy:/sbin/nologin [rootshy ~]# id oldboy uid996(oldboy) gid1004(incahome) 组1004(incahome),1003(sa) # UID和附加组也修改了。范例14-9将前文的 pig 用户由原来是 2026 年 7 月 14 日过期调整为 2026 年 8 月 14 日过期。[rootshy ~]# usermod -e 2026/08/14 pig [rootshy ~]# chage -l pig 最近一次密码修改时间 6月 14, 2026 密码过期时间 从不 密码失效时间 从不 帐户过期时间 8月 14, 2026 两次改变密码之间相距的最小天数 0 两次改变密码之间相距的最大天数 99999 在密码过期之前警告的天数 7五、删除用户命令 userdeluserdel 命令用于删除用户及用户相关的信息。1、userdel 命令语法和常用参数userdel [options] [login] userdel [选项] [用户名]表 14-11 userdel 命令的参数选项及说明2、userdel 命令实践在企业场景中如果不能确认用户相关的目录有没有重要数据就不能使用 -r。以下是删除经验小结。vi /etc/passwd然后注释掉用户观察 1 个月这样若出问题还可以还原。相当于进行操作前备份。将登录 Shell 修改为 /sbin/nologin。提示只要是修改和删除都要小心谨慎范例14-10删除用户 alex。[rootshy ~]# grep alex /etc/passwd alex:x:1007:1008::/home/alex:/bin/bash [rootshy ~]# userdel alex # 该方法仅用于删除用户 alex 本身但不删除其家目录及相关文件。 [rootshy ~]# grep alex /etc/passwd # /etc/passwd 中 alex 已经不存在了。 [rootshy ~]# ls -ld /home/alex/ # 但 /home/alex 家目录仍然存在。 drwx------ 2 1007 1008 62 6月 14 11:43 /home/alex/使用 “userdel 用户名” 这样的方法删除用户时只会删除用户本 身其家目录及用户的相关文件并不会被删除。一般在生产场景 中如果无法确定被删用户的家目录等是否有用或者有不规范的用户已在家目录下存在业务脚本或程序的时候就不要使用 “userdel -r 用户名” 这样危险的命令了而是直接使用 “userdel 用户名” 命令删除即可。当然还可以直接使用 vi 编辑 /etc/passwd找到要处理的用户先注释一段时间确认真的没问题了然后再清理其家目录注释的作用与 userdel 命令删除的效果一样就是实现了被注释的用户无法登录注释掉用户当前行即可的功能注释的作用有些类似于回收站一旦发现问题可以及时进行恢复工作。当然对于大门户上千台服务器大规模运维的情况可以使用 ldap 等服务实现账户统一认证登录批量地进行添加、删除和管理。范例14-11删除 zuma 用户及所有与用户相关的文件目录。如果在 userdel 命令后加上了参数 -r则表示在删除该用户的同时 将用户的家目录及本地邮件存储的目录和文件一并删除。因此一定要谨慎使用。具体实现代码如下[rootshy ~]# touch /home/zuma/test.txt # 在 zuma 家目录下建立测试文件。 [rootshy ~]# ls -l /home/zuma/test.txt # 查看建立的测试文件。 -rw-r--r-- 1 root root 0 7月 2 22:33 /home/zuma/test.txt [rootshy ~]# userdel -r zuma # 带 -r 参数删除用户。 [rootshy ~]# ls -l /home/zuma/test.txt ls: 无法访问/home/zuma/test.txt: 没有那个文件或目录 # 测试文件 test.txt 也被删除了。提示处于登录状态中的用户无法被删除。在生产场景中请不要轻易使用 -r 参数这会在删除用户的同时删除用户家目录下的所有文件和家目录。如果非要删除家目录那么当用户家目录下包含了重要的文件时建议在删除之前先进行备份。操作前进行备份在任何场合都是一个优秀运维人员应该具备的好习惯。