1、Linux 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 文件定义用户的默认值的。如果我们想要修改所有新建用户的某个默认值,就可以直接修改这两个文件,而不用每个用户单独修改了。
2、Linux passwd命令:修改用户密码
[root@localhost ~]#passwd [选项] 用户名
选项:
- -S:査询用户密码的状态,也就是 /etc/shadow 文件中的内容。仅 root 用户可用;
- -l:暂时锁定用户。仅 root 用户可用;
- -u:解锁用户。仅 root 用户可用;
- --stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
[root@localhost ~]#passwd #passwd直接回车代表修改当前用户的密码
root用户修改密码
下面举几个例子,我们给新用户 lamp 设定密码,让 lamp 用户可以登录系统。
【例 1】
[root@localhost ~]# passwd lamp 更改用户lamp的密码。 新的密码: <-输入新密码 无效的密码:WAY过短 <-有报错提示 无效的密码:过于简单 重新输入新的密码: <-第二次输入密码 passwd:所有的身份证验证令牌已经成功更新。
注意,要想给其他用户设定密码,只有两种用户可行:一种是 root 用户;另一种是 root 通过 sudo 命令赋予权限的普通用户。也就是说,普通用户只能修改自己的密码,而不能设定其他用户的密码。
还要注意一件事,设定用户密码时一定要遵守"复杂性、易记忆性、时效性"的密码规范。简单来讲就是密码要大于 8 位,包含大写字母、小写字母、数字和特殊符号中的 3 种,并且容易记忆和定期更换。但是 root 用户在设定密码时却可以不遵守这些规则,比如我刚刚给 lamp 用户设定的密码是"123",系统虽然会提示密码过短和过于简单,但是依然可以设置成功。不过普通用户在修改自己的密码时,一定要遵守密码规范。当然,在生产服务器上,就算是 root 身份,在设定密码时也要严格遵守密码规范,因为只有好的密码规范才是服务器安全的基础。
普通用户修改密码
那么我们看看普通用户 lamp 是如何修改密码的。
【例 2】
[lamp@localhost ~]$ whoami lamp #先看看我的身份 [lamp@localhost ~]$ passwd lamp1 passwd:只有根用户才能指定用户名称 #尝试修改lamp用户的密码,系统提示普通用户不能修改其他用户的密码 [lamp@localhost ~]$ passwd lamp passwd:只有根用户才能指定用户名称。
怎么修改自己的密码也报错呢?这里其实说得很清楚,要想指定用户名修改密码,只有管理员可以,哪怕 # 是修改自己的密码。那么修改自己的密码就只能像下面这样了:
[lamp@localhost ~]$ passwd #使用passwd直接回车,就是修改自己的密码 更改用户lamp的密码。 为lamp更改STRESS密码。 (当前)UNIX密码: #注意,普通用户需要先输入自己的密码 新的密码: 无效的密码:它基于字典单词 。 #好吧,又报错了,因为我输入的密码在字典中能够找到 新的密码: #密码必须符合密码规范 重新输入新的密码: passwd:所有的身份验证令牌已经成功更新。
大家发现了吗?对普通用户来讲,密码设定就要严格得多了。首先,只能使用"passwd"来修改自己的密码,而不能使用"passwd 用户名"的方式。不过,如果你是 root 用户,则建议用"passwd 用户名"的方式来修改密码,因为这样不容易搞混。其次,在修改密码之前,需要先输入旧密码。最后,设定密码一定要严格遵守密码规范。
查看用户密码状态
【例 3】
[root@localhost ~]# passwd -S lamp lamp PS 2013-01-06 0 99999 7 -1 (密码已设置,使 用SHA512加密。) #上面这行代码的意思依次是:用户名 密码 设定时间(2013*01-06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1)
"-S"选项会显示出密码状态,这里的密码修改间 隔时间、密码有效期、警告时间、密码宽限时间其实分别是 /etc/shadow 文件的第四、五、六、七个字段的内容。 当然,passwd 命令是可以通过命令选项修改这几个字段的值的,不过我个人认为还是直接修改 /etc/shadow 文件简单一些。
再次提醒一下,CentOS 6.3 加密方式已经从 MD5 加密更新到 SHA512 加密,我们不用了解具体的加密算法,只要知道这种加密算法更加可靠和先进就足够了。
锁定和解锁用户
使用 passwd 命令可以很方便地锁定和解锁某个用户,我们来试试。
【例 4】
[root@localhost ~]# passwd -l lamp #锁定用户lamp的密码。 passwd:操作成功 #锁定用户 [root@localhost ~]# passwd -S lamp lamp LK 2013-01-06 0 99999 7 -1 (密码已被锁定。) #用"-S"选项査看状态,很清楚地提示密码已被锁定 [root@localhost ~]# grep "lamp" /etc/shadow lamp:!! $6$ZTq7o/9o $lj07iZ0bzW.D1zBa9CsY43d04onskUCzjwiFMNt8PX4GXJoHX9zA1S C9.i Yzh9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7::: #其实锁定就是在加密密码之前加入了"!!"让密码失效而已
可以非常简单地实现用户的暂时锁定,这时 lamp 用户就不能登录系统了。那么解锁呢?也一样简单,我们来试试。
[root@localhost ~]# passwd -u lamp 解锁用户lamp的密码。 passwd:操作成功 #解锁用户 [root@localhost ~]# passwd -S lamp lamp PS 2013-01-06 0 99999 7 -1 (密码已设置,使用SHA512加密。) #锁定状态消失 [root@localhost ~]# grep "lamp" /etc/shadow lamp: $6$ZTq7cV9o $lj07iZ0bzW.D1zBa9CsY43d04onskUCzjwiFMNt8PX4GXJoHX9zA1S C9.iYz h9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7::: #密码前面的"!!"删除了
使用字符串作为用户的密码
这种做法主要是批量添加用户时,给所有的用户设定一个初始密码。但是需要注意的是,这样设定的密码会把密码明文保存在历史命令中,会有安全隐患。所以,如果使用了这种方式修改密码,那么应该记住两件事情:第一,手工清除历史命令;第二,强制这些新添加的用户在第一次登录时必须修改密码(具体方法参考"chage"命令)。
【例 5】
[root@localhost ~]# echo "123" | passwd --stdin lamp 更改用户lamp的密码。 passwd:所有的身份验证令牌已成功更新。
命令很简单,调用管道符,让 echo 的输出作为 passwd 命令的输入,就可以把 lamp 用户的密码设定为"123"了。