1. 命令格式

添加用户的命令是useradd,命令格式如下:

[root@localhost ~]# useradd [选项] 用户名
选项说明
-u UID指定该用户的UID,注意手工添加的用户的UID不要小于500
-d 家目录指定用户的家目录(默认为/home/username)。家目录必须写绝对路劲,而且如果需要手动指定家目录则一定要注意权限;
-c 用户说明添加用户说明。还记得/etc/passwd文件的第五个字段吗?这里就是指定该字段内容的;
-g 组名手工指定用户的初始组(必须已存在),不会建立与账户同名组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。如果不想使用默认初始组,则可以用-g指定,不建议手工修改;
-G 组名指定用户的附加组。我们把用户加入其他组,一般都使用附加组;建立用户的同时也会自动创建与用户名同名的初始组;
-s shell手工指定用户的登录shell。默认是/bin/bash;
-e 日期指定用户的失效日期,格式为”YYYY-MM-DD“,也就是/etc/shadow文件的第八个字段;
-o允许创建的用户的UID相同。例如,执行”useradd -u 0 -o usertest“命令建立用户usertest,它的UID和root用户的UID相同,都是0;
-N/-n不创建与用户同名的基本用户组;
-r建立系统帐号;
-m建立用户目录时强制建立用户的家目录。在建立系统用户时,该选项是默认的;
-M建立用户时不自动创建用户家目录,但是在passwd中还是会显示家目录的路劲;
-D查看新建用户的默认值
  1. 添加默认用户

如果我们只是创建用户,则可以不使用任何选项,系统会按照默认值帮我们指定这些选项,只需要最简单的命令就可以了。命令如下:

[root@localhost ~]# useradd lamp

那么,这条命令到底做了什么呢?我们依次来看看。

  1. 在/etc/passwd文件中按照文件格式添加lamp用户的行。
[root@localhost ~]# grep lamp /etc/passwd
lamp:x:1000:1000::/home/lamp:/bin/bash

注意:用户的UID是从1000开始计算的。同时默认指定了用户的家目录/home/lamp,用户的登录Shell为/bin/bash。

  1. 在/etc/shadow文件中建立用户lamp的相关行。
[root@localhost ~]# grep lamp /etc/shadow
lamp:!!:18339:0:99999:7:::

当然,这个用户还没有设置密码,所以密码字段是“!!”,代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段。

  1. 在/etc/group 文件中建立和用户lamp相关的行。
[root@localhost ~]# grep lamp /etc/group
lamp:x:1000:

因为lamp组是lamp用户的初始组,所以ap用户名不会写入第四个字段。

  1. 在/etc/gshadow文件中建立和用户lamp 相关的行。
[root@localhost ~]# grep lamp /etc/gshadow
lamp:!::

当然,我们没有设定组密码,所以这里没有密码,也没有组管理员。

  1. 默认建立用户的家目录和邮箱。
[root@localhost ~]# ll -d /home/lamp/ /var/spool/mail/lamp 
drwx------. 2 lamp lamp 62 Mar 18 12:22 /home/lamp/
-rw-rw----. 1 lamp mail  0 Mar 18 12:22 /var/spool/mail/lamp

注意这两个文件的权限,都要让lamp用户拥有相应的权限。

大家看到了吗? useradd 命令在添加用户的时候,其实就是修改了我们在前面介绍的7个文件或目录,那么我们可以通过手工修改这些文件来添加或删除用户吗?当然可以了,到在后面会演示如何通过手工修改文件来删除用户。那什么时候需要手工建立用户?说明时候需要命令建立用户?其实在任何情况下都不需要手工修改文件来建立用户,我们命令来建立用户既简便又快捷。我们在这里只是为了说明Linux系统中的所有内容都是保存在文件中的。

  1. 手工指定选项添加用户

刚刚我们在添加用户的时候全部采用的是默认值,那么我们使用选项来添加用户会有什么样的效果?

[root@localhost ~]# groupadd lamp1
#先手工添加lamp1用户组,因为我一会儿要把lamp1用户的初始组指定过来,如果不事先建立,则会报告用户组不存在
[root@localhost ~]# useradd -u 1005 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1
#再建立用户lamp1的同事指定了UID(1005)、初始组(lamp1)、附加组(root)、家目录(/home/lamp1)、用户说明(test user)和用户登Shell(/bin/bash)
[root@localhost ~]# grep "lamp1" /etc/passwd /etc/shadow /etc/group
#同时查看着三个文件中关于lamp1的行
/etc/passwd:lamp1:x:1005:1002:test user:/home/lamp1:/bin/bash
#用户的UID、初始组、用户说明、家目录和登录shell都和命令手工指定的一致
/etc/shadow:lamp1:!!:18339:0:99999:7:::
#lamp1用户还没有设定密码
/etc/group:root:x:0:lamp1
#lamp1用户加入了root组,root组是lamp1用户的附加组
/etc/group:lamp1:x:1002:  
#GID为1002的组是lamp1组
[root@localhost ~]# ll -d /home/lamp1/ /var/spool/mail/lamp1
drwx------. 2 lamp1 lamp1 80 Mar 18 16:31 /home/lamp1/
-rw-rw----. 1 lamp1 mail   0 Mar 18 16:31 /var/spool/mail/lamp1
#家目录也建立了,不需要手工建立,用户邮箱目录也自动创建了

例子有点复杂,其实如果可以看懂还是很简单的,就是添加了用户,但是不再使用用户的默认值,而是手工指定了用户的UID (是1005,而不再是1001)、初始组、附加组、家目录、用户说明和用户登录Shell。这里还要注意一点,虽然手工指定了用户的家目录,但是家目录不需要手工建立,在添加用户的同时会自动建立家目录。如果手工建立了家目录,那么一定要修改目录的权限和从/etc/skel/模板目录中复制环境变量文件,反而更加麻烦。

  1. useradd命令的默认值设定

大家发现了吗?在添加用户时,其实不需要手工指定任何内容,都可以使用useradd命令创建,这些默认值已轻可以满足我们的要求,但是useradd命令的这些默认值是保存在哪里的呢?能否手工修改呢?

useradd命令在添加用户时参考的默认值文件主要有两个,分别是/etc/default/useradd和/etc/login.defs。我们先看看/etc/default/useradd文件的内容。

[root@localhost ~]# vim /etc/default/useradd 
#useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

逐行解释一下。

  • GROUP=100
    • 这个选项用于建立用户的默认组,也就是说,在添加每个用户时,用户的初始组就是GID为100的这个用户组。但是我们已经知道CentOS并不是这样的,而是在添加用户时会自动建立和用户名相同的组作为这个用户的初始组。也就是说这个选项并没有生效,因为Linux中默认用户组有两种机制:一种是私有用户组机制,系统会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用GID是100的用户组作为所有新建用户的初始组。目前我们采用的是私有用户组机制。
  • HOME=/home
    • 这个选项是用户的家目录的默认位置,所以所有新建用户的家目录默认都在/home/下。
  • INACTIVE=-1
    • 这个选项是密码过期后的宽限天数,也就是/etc/shadow 文件的第七个字段。其作用是在密码过期后,如果用户还是没有修改密码,那么在宽限天数内用户还是可以登录系统的;如果过了宽限天数,那么用户就无法再使用该密码登录了。这里默认值是-1,代表所有新建立的用户密码永远不会失效。
  • EXPIRE=
    • 这个选项是密码失效时间,也就是/etc/shadow文件的第八个字段。也就是说,用户到达这个日期后就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,代表所有新建用户没有失效时间,永久有效。
  • SHELL=/bin/bash
    • 这个选项是用户的默认Shell。/bin/bash是Linux的标准Shell。代表所有新建立的用户默认Shell都是/bin/bash。
  • SKEL=/etc/skel
    • 这个选项用于定义用户的模版目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目录中。
  • CREATE_MAIL_SPOOL=yes
    • 这个选项是定义是否给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在/var/spool/mail/目录下,和用户名相同。

当然,这个文件也可以直接通过命令进行查看,结果是一样的。命令如下:

[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

通过/etc/default/useradd文件大家已经能够看到我们新建用户的部分默认值,但是还有一些内容并没有在这个文件中出现,比如用户的UID为什么默认从500开始计算,/etc/shadow文件中除第一、二、三个字段不用设置默认值外,还有第四、五、六个字段没有指定默认值(第七、八个字段的默认值在/etc/default/useradd文件中指定了)。那么,这些默认值就需要第二个默认值文件/etc/login.defs了,这个文件的内容如下:

[root@localhost ~]# cat /etc/login.defs | grep -v "^$" | grep -v "^#"
#这个文件有些注释和空行,把注释和空行删除掉,文件内容就变成下面这个样子了
MAIL_DIR    /var/spool/mail
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

我们逐行解释下文件内容。

  • MAIL_DIR /var/spool/mail
    • 这行指定了新建用户的默认邮箱位置。比如 lamp 用户的邮箱是就是/var/spool/mail/lamp。
  • PASS_MAX_DAYS 99999
    • 这行指定的是密码的有效期,也就是/etc/shadow 文件的第五字段。代表多少天之后必须修改密码,默认值是 99999。
  • PASS_MIN_DAYS 0
    • 这行指定的是两次密码的修改间隔时间,也就是/etc/shadow 文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是 0。
  • PASS_MIN_LEN 5
    • 这行代表密码的最小长度,默认不小于 5 位。但是我们现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
  • PASS_WARN_AGE 7
    • 这行代表密码修改到期前的警告天数,也就是/etc/shadow 文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是 7 天。
  • UID_MIN 1000
  • UID_MAX 60000
    • 这两行代表创建用户时最小 UID 和最大的 UID 的范围。我们 2.6.x 内核开始,Linux用户的 UID最大可以支持 232这么多,但是真正使用时最大范围是 60000。还要注意如果手工指定了一个用户的 UID 是 1050,那么下一个创建的用户的 UID 就会从 1051 开始,哪怕 1000-1049 之间的 UID 没有使用(小于 500 的 UID 是给伪用户预留的)。
  • GID_MIN 500
  • GID_MAX 60000
    • 这两行指定了 GID 的最小值和最大值之间的范围。
  • CREATE_HOME yes
    • 这行指定建立用户时是否自动建立用户的家目录,默认是建立。
  • UMASK 077
    • 这行指定的是建立的用户家目录的默认权限,因为 umask 值是 077,所以新建的用户家目录的权限是 700。
  • USERGROUPS_ENAB yes
    • 这行指定的是使用命令 userdel 删除用户时,是否删除用户的初始组,默认是删除。
  • ENCRYPT_METHOD SHA512
    • 这行指定 Linux 用户的密码使用 SHA512 散列模式加密。这是新的密码加密模式,原先的 Linux只能用 DES 或 MD5 方式加密。

我们现在已经知道了,系统在默认添加用户时,是靠/etc/default/useradd和/etc/login.defs文件定义用户的默认值的。如果我们想要修改所有新建用户的某个默认值,就可以直接修改这两个文件,而不用每个用户单独修改了。

Logo

更多推荐