在Linux 系统中,可以使用 useradd 命令新建用户,此命令的基本格式如下:
[root@localhost ~]#useradd [选项] 用户名
该命令常用的选项及各自的含义,如表 1 所示。
表 1 useradd命令常用选项
其实,系统已经帮我们规定了非常多的默认值,在没有特殊要求下,无需使用任何选项即可成功创建用户。例如:
558idc@558idc:~/558idc.com$ sudo useradd linuxmi
558idc@558idc:~/558idc.com$ sudo useradd -m 558idc.com
此行命令就表示创建 linuxmi 普通用户。
不要小看这条简单的命令,它会完成以下几项操作:
1. 在 /etc/passwd 文件中创建一行与 linuxmi 用户相关的数据:
558idc@558idc:~/558idc.com$ grep "linuxmi" /etc/passwd
linuxmi:x:1001:1001::/home/linuxmi:/bin/sh
可以看到,用户的 UID 是从 1001 开始计算的。同时默认指定了用户的家目录为 /home/linuxmi/,用户的登录 Shell 为 /bin/sh。
2. 在 /etc/shadow 文件中新增了一行与 linuxmi 用户密码相关的数据:
558idc@558idc:~/558idc.com$ sudo grep "linuxmi" /etc/shadow
linuxmi:!:18034:0:99999:7:::
当然,这个用户还没有设置密码,所以密码字段是 "!!",代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段,例如密码有效期有 99999 天,距离密码过期 7 天系统会提示用户“密码即将过期”等。
3. 在 /etc/group 文件中创建一行与用户名一模一样的群组:
558idc@558idc:~/558idc.com$ grep "linuxmi" /etc/group
linuxmi:x:1001:
该群组会作为新建用户的初始组。
4. 在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息:
558idc@558idc:~/558idc.com$ sudo grep "linuxmi" /etc/gshadow
linuxmi:!::
当然,我们没有设定组密码,所以这里没有密码,也没有组管理员。
5. 默认创建用户的主目录和邮箱:
drwxr-xr-x 2 558idc.com 558idc.com 4096 5月 18 05:03 /home/558idc.com//
558idc@558idc:~/558idc.com$ ll /var/spod/mail/558idc.com
注意文件的权限,要让 558idc.com 用户拥有相应的权限。
6. 将 /etc/skel 目录中的配置文件复制到新用户的主目录中(至于为什么,学完本节内容就会明白)。
可以看到,useradd 命令创建用户的过程,其实就是修改了与用户相关的几个文件或目录,对这些文件的详细介绍见 https://www.558idc.com/Linux/2019-05/158718.htm 。
那useradd 命令的这些默认值保存哪里,能否手工修改呢?
答案是肯定的。useradd 命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd 和 /etc/login.defs。
/etc/default/useradd 文件
首先,使用 Vim 命令查看 /etc/default/useradd 文件中包含哪些内容:
558idc@558idc:~/558idc.com$ cat /etc/default/useradd
# Default values for useradd(8)
#
# The SHELL variable specifies the default login shell on your
# system.
# Similar to DHSELL in adduser. However, we use "sh" here because
# useradd is a low level utility and should be as general
# as possible
SHELL=/bin/sh
#
# The default group for users
# 100=users on Debian systems
# Same as USERS_GID in adduser
# This argument is used when the -n flag is specified.
# The default behavior (when -n and -g are not specified) is to create a
# primary user group with the same name as the user being added to the
# system.
# GROUP=100
#
# The default home directory. Same as DHOME for adduser
# HOME=/home
#
# The number of days after a password expires until the account
# is permanently disabled
# INACTIVE=-1
#
# The default expire date
# EXPIRE=
#
# The SKEL variable specifies the directory containing "skeletal" user
# files; in other words, files such as a sample .profile that will be
# copied to the new user's home directory when it is created.
# SKEL=/etc/skel
#
# Defines whether the mail spool should be created while
# creating the account
# CREATE_MAIL_SPOOL=yes
另外,也可以直接通过命令进行查看:
558idc@558idc:~/558idc.com$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
-D 选项指的就是查看新建用户的默认值。
表 2 对此文件中的各项做了详细的解释。
表 2 /etc/default/useradd 文件内容
Linux 中默认用户组有两种机制:一种是私有用户组机制,系统会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。目前我们采用的是私有用户组机制。
注意,此文件中各选项值的修改方式有 2 种,一种是通过 Vim 文本编辑器手动修改,另一种就是使用文章开头介绍的 useradd 命令,不过所用的命令格式发生了改变:
useradd -D [选项] 参数
用此命令修改 /etc/default/useradd 文件,可使用的选项如表 3 所示。
useradd -D 命令可用选项
例如,要修改新用户的默认 Shell 为 /bin/csh,可以使用如下方式:
root@558idc:/home/558idc/558idc.com# useradd -D -s /bin/csh
root@558idc:/home/558idc/558idc.com# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
通过 /etc/default/useradd 文件,大家仅能修改有关新用户的部分默认��,有一些内容并没有在这个文件中,例如修改用户默认的 UID、GID,以及对用户密码的默认设置,对这些默认值的修改就需要在 /etc/login.defs 文件中进行。
有关 /etc/login.defs 文件,可阅读《Linux新建用户配置文件 /etc/login.defs 详解》一文,见 https://www.558idc.com/Linux/2019-05/158732.htm。
其实,useradd 命令创建用户的过程是这样的,系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,也就是向 /etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了。
当然,如果你能彻底掌握 useradd 命令创建用户的整个过程,完全可以手动创建用户。
更多Linux命令相关信息见Linux命令大全 专题页面 https://www.558idc.com/topicnews.aspx?tid=16