阅读:0

Linux useradd命令详解:添加新的系统用户

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

[root@localhost ~]#useradd [选项] 用户名

选项:
  • -u UID: 手工指定用户的 UID,注意手工添加的用户的 UID 不要小于 500;
  • -d 家目录:手工指定用户的家目录。家目录必须写绝对路径,而且如果需要手工指定家目录,则一定要注意权限;
  • -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;
  • -m:建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;

添加默认用户

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

【例 1】添加用户

[root@localhost ~]# useradd lamp

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

1) 在 /etc/passwd 文件中按照文件格式添加 lamp 用户的行。

[root@localhost ~]# grep "lamp" /etc/passwd
lamp:x:500:500::/home/lamp:/bin/bash

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

2) 在 /etc/shadow 文件中建立用户 lamp 的相关行。

[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!!:15710:0:99999:7:::

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

3) 在 /etc/group 文件中建立和用户 lamp 相关的行。

[root@localhost ~]# grep "lamp" /etc/group lamp:x:500:

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

4) 在 /etc/gshadow 文件中建立和用户 lamp 相关的行。

[root@localhost ~]# grep "lamp" /etc/gshadow lamp:!::

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

5)默认建立用户的家目录和邮箱。

[root@localhost ~]#ll -d /home/lamp/
drwx------ 3 lamp lamp 4096 1月6 00:19 /home/lamp/
[root@localhost ~]#ll /var/spod/mail/lamp
-rw-rw---- 1 lamp mail 0 1月6 00:19 /var/spool/mail/lamp

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

大家看到了吗? useradd 命令在添加用户的时候,其实就是修改了我们在前面介绍的 7 个文件或目录,那么我们可以通过手工修改这些文件来添加或删除用户吗?当然可以了,我们在后面会演示如何通过手工修改文件来删除用户。

那什么时候需要手工建立用户?什么时候需要用命令建立用户?其实在任何情况下都不需要手工修改文件来建立用户,我们用命令来建立用户既简便又快捷。我们在这里只是为了说明 Linux 中的所有内容都是保存在文件中的。

手工指定选项添加用户

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

【例 2】

[root@localhost ~]# groupadd lampl
#先手工添加lamp1用户组,因为我一会儿要把lamp1用户的初始迎指定过来,如果不事先建立,则会报告用户组不存在
[root@localhost ~]# useradd -u 550 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1
#在建立用户lamp1的同时指定了UID(550)、初始组(lamp1)、附加组(root)、家目录(/home/ lamp1/)、用户说明(test user)和用户登录Shell(/bin/ bash)
[root@localhost ~]# grep "lamp1" /etc/passwd /etc/shadow /etc/group
#同时查看三个文件
/etc/passwd:lamp1:x:550:502:test user:/home/lamp1:/bin/bash
#用户的UID、初始组、用户说明、家目录和登录Shell都和命令手工指定的一致
/etc/shadow:lamp1:!!:15710:0:99999:7:::
#lamp1用户还没有设定密码
/etc/group:root:x:0:lamp1
#lamp1用户加入了root组,root组是lamp1用户的附加组
/etc/group:lampl:x:502:
#GID为502的组是lamp1组
[root@localhost ~]#ll -d /home/lamp1/
drwx------ 3 lamp1 lamp1 4096 1月6 01:13 /home/lamp1/
#家目录也建立了,不需要手工建立

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

useradd命令的默认值设定

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

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

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

逐行解释一下:
  • GR0UP=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

选项:
  • -D:查看新建用户的默认值

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

[root@localhost ~]# vi /etc/login.defs
#这个文件有一些注释,把注释删除,文件内容就变成下面这个样子了
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
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 500及UID_MAX 60000:这两行代表创建用户时最小 UID 和最大 UID 的范围。从 2.6.x 内核开始,Linux 用户的 UID 最大可以支持到 232,但是真正使用时最大范围是60000。还要注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用(小于 500 的 UID 是给伪用户预留的)。
  • GID_MIN 500 及 GID_MAX 60000:这两行指定了 GID 的最小值和最大值的范围。
  • CREATE_HOME yes:这行指定建立用户时是否自动建立用户的家目录,默认是建立。
  • UMASK 077:这行指定建立的用户家目录的默认权限,因为 umask 值是 077,所以新建的用户家目录的权限是 700。
  • USERGROUPS_ENAB yes:这行指定使用命令 userdd 删除用户时,是否删除用户的初始组,默认是删除。
  • ENCRYPT_METHOD SHA512:这行指定 Linux 用户的密码使用 SHA5121 散列模式加密。这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。

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