Linux 用户管理知识与应用实践
本章将深入讲解用户管理的知识,并带领小伙伴们实践 Linux 运维中有关用户管理的工作。
三、添加用户命令 useradd
1、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 的取值起始值及取值范围,用户及密码的有效期限等,完整功能请参见下文配置文件中的注释说明。
[root@shy ~]# 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 编辑器来修改文件里面的内容,下面就来看看它的内容,具体如下:
[root@shy ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 # 依赖于 /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_SPOOL=yes # 创建 mail 文件。D. 与创建用户相关的目录 /etc/skel
/etc/skel目录是用来存放新用户需要的所有基础环境变量文件的目录,当添加新用户时,这个目录下的所有文件都会被自动复制到新添加的用户的家目录下;默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以点号开头的文件),通过修改、添加、删除/etc/skel目录下的环境变量文件,可为新创建的用户提供统一的、标准的、定制化的初始化用户环境。
[root@shy ~]# 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$解答:首先模拟故障重现,步骤如下:
[root@shy ~]# su - oldboy # 切换到 oldboy 用户下 [oldboy@shy ~]$ rm -f .bash* # 故障原因是用户家目录下的环境变量不存在了。 [oldboy@shy ~]$ logout # 按快捷键(Ctrl+D),退出当前环境。 [root@shy ~]# 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 [root@shy ~]# su - oldboy # 重新切换到 oldboy 用户下 上一次登录:日 6月 14 11:16:34 CST 2026pts/0 上 [oldboy@shy ~]$ # 故障已排除方法二:仅适用于临时情况
执行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。
[root@shy ~]# useradd alex # 添加用户 alex [root@shy ~]# ls -ld /home/alex/ # 在 /home 下,增加了以 alex 为目录的家目录。 drwx------ 2 alex alex 62 6月 14 11:43 /home/alex/ # 权限是 700,/etc/login.defs 中设定的。 [root@shy ~]# 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。 [root@shy ~]# grep -w alex /etc/passwd # 查看用户生成情况。 alex:x:1007:1008::/home/alex:/bin/bash 需要提醒的是,在添加用户 alex 的同时,还会添加与用户名相同的用户组 alex。 [root@shy ~]# tail -l /etc/group # 查看用户组的生成情况。 alex:x:1008: [root@shy ~]# tail -l /etc/shadow # 还会在 shadow 里记录用户组的信息。 alex:!!:20618:0:99999:7::: [root@shy ~]# 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-3:useradd 的 -g、-u 参数的使用示例。
创建用户 zuma,属于指定组 root,UID 为 888,实现步骤具体如下:
[root@shy ~]# useradd zuma -u 888 -g root # 创建用户 zuma,属于指定组 root,UID 为 888。 [root@shy ~]# id zuma # 查看生效信息。 uid=888(zuma) gid=0(root) 组=0(root)范例14-4:useradd 的 -M、-s 参数的使用示例。
创建一个虚拟用户 mysql,禁止其登录,且不创建家目录,实现步骤如下:
[root@shy ~]# useradd mysql -s /sbin/nologin -M [root@shy ~]# tail -l /etc/passwd mysql:x:1008:1009::/home/mysql:/sbin/nologin注意:这个例子比较具有代表性,在生产场景部署网络服务时经常会用到。
范例14-5:useradd 的 -e 参数的使用示例。
在本例中,我们主要是练习下 -e 参数的使用,这个参数的作用是设定用户到什么时候过期。在生产场景中,员工离职,或者一些临时有需求的用户,或者对时间有限制的一些用户,可能会需要这个选项,下面的示例代码会实现添加用户 pig 的操作,用户有效期 1 个月,实现步骤如下:
[root@shy ~]# date +%F # 查看系统当前日期。 2026-06-14 [root@shy ~]# useradd pig -e "2026/07/14" # 设置用户过期时间,一个月后过期。 [root@shy ~]# 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-6:useradd -c、-u、-G、-s、-d -m 多个参数组合的示例。
描述如下:添加用户 oldboyedu,并设置其用户注释信息为 good training,UID 指定为 806,分别属于用户组 root、oldboy、 sa 的成员,其 Shell 解释器类型为 /bin/sh,设置家目录为 /home/luffy。实际操作步骤及结果具体如下:
[root@shy ~]# useradd -c "good training" -u 806 -G root,oldboy,sa -s /bin/sh -d /home/luffy oldboyedu [root@shy ~]# tail -l /etc/passwd # passwd 里增加了 oldboyedu 用户记录。 oldboyedu:x:806:1012:good training:/home/luffy:/bin/sh [root@shy ~]# id oldboyedu # 查询 UID 和 GID 以及所归属的用户组。 uid=806(oldboyedu) gid=1012(oldboyedu) 组=1012(oldboyedu),0(root),1003(sa),1011(oldboy) [root@shy ~]# 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。
[root@shy ~]# cat /etc/shells # 查看当前系统支持的 Shell 解释器种类 /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash [root@shy ~]# grep -w SHELL /etc/default/useradd # 查看 /etc/default/useradd 解释器配置 SHELL=/bin/bash [root@shy ~]# useradd -D -s /sbin/nologin # 修改默认解释器 [root@shy ~]# grep -w SHELL /etc/default/useradd # 查看修改结果 SHELL=/sbin/nologin [root@shy ~]# useradd newuser # 这里不加参数添加用户 [root@shy ~]# grep newuser /etc/passwd newuser:x:1010:1013::/home/newuser:/sbin/nologin # 解释器默认变成 /sbin/nologin [root@shy ~]# useradd -D -s /bin/bash # 测试完毕后改回原默认状态,以防止后面的测试出错 [root@shy ~]# grep -w SHELL /etc/default/useradd SHELL=/bin/bash关于这个 -D 参数的讲解就到这里。如果还不会使用,那么可直接修改/etc/default/useradd参数配置文件; Linux 系统中解决问题的方式是很灵活的,读者可以选择简单、方便、适合自己掌握的方式, 但是思路必须要清晰。
四、用户信息修改命令 usermod
usermod 命令能更改用户的解释器类型、UID、家目录等,以及更改用户的有效期、登录名等很多与用户有关的信息。
1、usermod 命令语法和常用参数
usermod [options] [login] usermod [选项] [用户名]usermod 用于修改用户,而 useradd 用于添加用户,本质上都是对用户进行操作,因此,这两个命令大部分的参数作用都是一样的。
表 14-10 usermod 常用参数说明
2、usermod 命令实践
范例14-8:usermod 命令 -c、-u、-G、-s、-d 多参数组合的示例。
这里对 useradd 实践的范例14-6 中创建的用户进行修改。修改 oldboy 用户属性,将注释说明改为 good,UID改为 996, 所属的附加组改为 sa,同时禁止其登录,家目录改为 /home/oldboy。实际操作步骤及结果具体如下:
[root@shy ~]# usermod -c "good" -u 996 -G sa -s /sbin/nologin -d /home/oldboy oldboy # 修改用户信息,将说明改为good,UID改为996,所属的附加组改为sa,禁止登录,家目录改为 #/home/oldboy。 [root@shy ~]# tail -l /etc/passwd oldboy:x:996:1004:good:/home/oldboy:/sbin/nologin [root@shy ~]# id oldboy uid=996(oldboy) gid=1004(incahome) 组=1004(incahome),1003(sa) # UID和附加组也修改了。范例14-9:将前文的 pig 用户由原来是 2026 年 7 月 14 日过期,调整为 2026 年 8 月 14 日过期。
[root@shy ~]# usermod -e "2026/08/14" pig [root@shy ~]# chage -l pig 最近一次密码修改时间 :6月 14, 2026 密码过期时间 :从不 密码失效时间 :从不 帐户过期时间 :8月 14, 2026 两次改变密码之间相距的最小天数 :0 两次改变密码之间相距的最大天数 :99999 在密码过期之前警告的天数 :7五、删除用户命令 userdel
userdel 命令用于删除用户及用户相关的信息。
1、userdel 命令语法和常用参数
userdel [options] [login] userdel [选项] [用户名]表 14-11 userdel 命令的参数选项及说明
2、userdel 命令实践
在企业场景中,如果不能确认用户相关的目录有没有重要数据,就不能使用 -r。以下是删除经验小结。
vi /etc/passwd,然后注释掉用户,观察 1 个月,这样若出问题还可以还原。相当于进行操作前备份。- 将登录 Shell 修改为 /sbin/nologin。
提示:只要是修改和删除,都要小心谨慎!
范例14-10:删除用户 alex。
[root@shy ~]# grep alex /etc/passwd alex:x:1007:1008::/home/alex:/bin/bash [root@shy ~]# userdel alex # 该方法仅用于删除用户 alex 本身,但不删除其家目录及相关文件。 [root@shy ~]# grep alex /etc/passwd # /etc/passwd 中 alex 已经不存在了。 [root@shy ~]# 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,则表示在删除该用户的同时, 将用户的家目录及本地邮件存储的目录和文件一并删除。因此,一定要谨慎使用。具体实现代码如下:
[root@shy ~]# touch /home/zuma/test.txt # 在 zuma 家目录下建立测试文件。 [root@shy ~]# ls -l /home/zuma/test.txt # 查看建立的测试文件。 -rw-r--r-- 1 root root 0 7月 2 22:33 /home/zuma/test.txt [root@shy ~]# userdel -r zuma # 带 -r 参数删除用户。 [root@shy ~]# ls -l /home/zuma/test.txt ls: 无法访问/home/zuma/test.txt: 没有那个文件或目录 # 测试文件 test.txt 也被删除了。提示:处于登录状态中的用户无法被删除。
在生产场景中,请不要轻易使用 -r 参数,这会在删除用户的同时删除用户家目录下的所有文件和家目录。如果非要删除家目录,那么当用户家目录下包含了重要的文件时,建议在删除之前先进行备份。操作前进行备份在任何场合都是一个优秀运维人员应该具备的好习惯。