用户和用户组管理,顾名思义就是添加用户和用户组、更改密码和设定权限等操作。可能有很多人觉得用户管理没有意义,因为我们在使用个人计算机的时候,不管执行什么操作,都以管理员账户登录,而从来没有添加和使用过其他普通用户。这样做对个人计算机来讲问题不大,不过在服务器上是行不通的。大家想象一下,我们是一个管理团队,共同维护一组服务器,难道每个人都能够被赋予管理员权限吗?显然是不行的,因为不是所有的数据都可以对每位管理员公开,而且如果在运维团队中有某位管理员对Linux不熟悉,那么赋予他管理员权限的后果可能是灾难性的。所以,越是对安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。
我们已经知道Linux中的所有内容都是文件,所有内容如果想要永久生效,都需要保存到文件中,那么用户信息当然也要保存到文件中。我们需要先掌握这些和用户管理相关的文件。
这个文件中保存的就是系统中所有的用户和用户的主要信息。我们打开这个文件来看看内容到底是什么。
[root@localhost ~]# vi /etc/passwd
#查看一下文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...省略部分输出...
这个文件的内容非常规律,每行代表一个用户。大家可能会比较惊讶,Linux系统中默认怎么会有这么多的用户啊!这些用户中的绝大多数是系统或服务正常运行所必需的用户,我们把这种用户称为系统用户或伪用户。系统用户是不能登录系统的,但是这些用户同样也不能被删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
那么我们就把root用户这一行拿出来,看看这个文件中的内容具体代表的含义吧。我们会注意到,这个文件用“:”作为分隔符,划分为7个字段,我们逐个来看具体的含义。
第一个字段中保存的是用户名称。不过大家需要注意,用户名称只是为了方便管理员记忆,Linux系统是通过用户ID(UID)来区分不同用户、分配用户权限的。而用户名称和UID的对应正是通过/etc/passwd这个文件来定义的。
这里我们说“x”代表的是密码标志,而不是真正的密码,真正的密码是保存在/etc/shadow文件中的。在早期的UNIX中,这里保存的就是真正的加密密码串,但是这个文件的权限是644,查询命令如下:
[root@localhost ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1648 12月 29 00:17 /etc/passwd
所有用户都可以读取/etc/passwd文件,这样非常容易导致密码的泄露。虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。所以现在的Linux系统把真正的加密密码串放置在影子文件/etc/shadow中,而影子文件的权限是000,查询命令如下:
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1028 12月 29 00:18 /etc/shadow
这个文件是没有任何权限的,但因为我是root用户,所以读取权限不受限制。当然,用强制修改的方法也是可以手工修改这个文件的内容的。只有root用户可以浏览和操作这个文件,这样就最大限度地保证了密码的安全。
所以在/etc/passwd中只有一个“x”代表用户是拥有密码的,我们把这个字段称作密码标志,具体的密码要去/etc/shadow文件中查询。但是这个密码标志“x”也是不能被删除的,如果删除了密码标志“x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登录(当然只能在本机上使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
第三个字段就是用户ID(UID),我们已经知道系统是通过UID来识别不同的用户和分配用户权限的。这些UID是有使用限制和要求的,我们需要了解。
这些用户足够使用了,但是如果不够也不用害怕,2.6.x内核以后的Linux系统用户UID已经可以支持2^32个用户了。
第四个字段就是用户的组ID(GID),也就是这个用户的初始组的标志号。这里需要解释一下初始组和附加组的概念。
所谓初始组,指用户一登录就立刻拥有这个用户组的相关权限。每个用户的初始组只能有一个,一般就是将和这个用户的用户名相同的组名作为这个用户的初始组。举例来说,我们手工添加用户lamp,在建立用户lamp的同时就会建立lamp组作为lamp用户的初始组。
所谓附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组要把用户再加入其他的用户组外,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。举例来说,刚刚的lamp用户除属于初始组lamp外,我又把它加入了users组,那么lamp用户同时属于lamp组、users组,其中lamp是初始组,users是附加组。当然,初始组和附加组的身份是可以修改的,但是我们在工作中一般不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
注意:在/etc/passwd文件的第四个字段中看到的ID是这个用户的初始组。
第五个字段是这个用户的简单说明,没有什么特殊作用,可以不写。
第六个字段是这个用户的家目录,也就是用户登录后有操作权限的访问目录,我们把这个目录称为用户的家目录。超级用户的家目录是/root目录,普通用户在/home/目录下建立和用户名相同的目录作为家目录,如lamp用户的家目录就是/home/lamp/目录。
Shell就是Linux的命令解释器。管理员输入的密码都是ASCII码,也就是类似abcd的英文。但是系统可以识别的编码是类似0101的机器语言。Shell的作用就是把ASCII编码的命令翻译成系统可以识别的机器语言,同时把系统的执行结果翻译为用户可以识别的ASCII编码。Linux的标准Shell就是/bin/bash。
在/etc/passwd文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果写入的是Linux的标准Shell, /bin/bash就代表这个用户拥有权限范围内的所有权限。例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/bin/bash
我手工添加了lamp用户,它的登录Shell是/bin/bash,那么这个用户就可以使用普通用户的所有权限。如果我把lamp用户的Shell修改为/sbin/nologin,例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/sbin/nologin
那么这个用户就不能登录了,因为/sbin/nologin就是禁止登录的Shell。这样说明白了吗?如果我在这里放入的是一个系统命令,如/usr/bin/passwd,例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/usr/bin/passwd
那么这个用户可以登录,但是登录之后就只能修改自己的密码了。但是在这里不能随便写入和登录没有关系的命令,如ls,否则系统不会识别这些命令,也就意味着这个用户不能登录。
这个文件中保存着用户的实际加密密码和密码有效期等参数。我们已经知道这个文件的权限是000,所以保存的实际加密密码除root用户外,其他用户是不能查看的,这样做有效地保证了密码的安全。如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。我们打开这个文件看看,例如:
[root@localhost ~]# vi /etc/shadow
root:$6$9w5Td6lg$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fI38RH15wzVoom
ff9isV1PzdcXmixzhnMVhMxbv0:15775:0:99999:7:::
#上面为一行
bin:*:15513:0:99999:7:::
daemon:*:15513:0:99999:7:::
…省略部分输出…
这个文件的每行代表一个用户,同样使用“:”作为分隔符,划分为9个字段。
这个文件是记录组ID(GID)和组名的对应文件。/etc/passwd文件的第四个字段记录的是每个用户的初始组的ID,那么这个GID的组名到底是什么呢?就要从/etc/group文件中查找。这个文件的内容如下:
[root@localhost ~]# vi /etc/group
root :x :0 :
bin :x :1 :bin, daemon
daemon:x:2:bin, daemon
...省略部分输出...
lamp:x:502:
我们手工添加的用户lamp也会默认生成一个lamp用户组,GID是502,作为lamp用户的初始组。这个文件和上面两个文件一样,用“:”作为分隔符,划分为4个字段。
这个文件就是保存组密码的文件。如果我们给用户组设定了组管理员,并给该用户组设定了组密码,那么组密码就保存在这个文件中,组管理员就可以利用这个密码管理这个用户组了。
该文件的内容如下:
[root@localhost ~]# vi /etc/gshadow
root:::
bin:::bin, daemon
daemon:::bin, daemon
...省略部分输出...
lamp:! ::
这个文件同样使用“:”作为分隔符,把文件划分为4个字段。
上面介绍的4个文件是用户的配置文件,每个用户的信息、权限和密码都保存在这4个文件中。下面要介绍的几个文件虽然不是用户的配置文件,但也是在创建用户时所自动建立或者和用户创建相关的文件。
每个用户在登录Linux系统时,必须有一个默认的登录位置,该用户对这个目录应该拥有一定的权限,我们把这个目录称作用户的家目录。普通用户的家目录位于/home/下,目录名和用户名相同。例如,lamp用户的家目录就是/home/lamp/,这个目录的权限如下:
[root@localhost ~]# ll -d /home/lamp/
drwx------ 3 lamp lamp 4096 1月 4 05:40 /home/lamp/
目录的属主是lamp用户,属组是lamp用户组,权限是700,lamp用户对/home/lamp/家目录拥有读、写和执行权限。
超级用户的家目录位于/下。例如,超级用户的家目录就是/root/,这个目录的权限如下:
[root@localhost ~]# ll -d /root/
dr-xr-x--- 6 root root 4096 12月 29 00:17 /root/
在Linux中,家目录用“~”表示,当前命令的提示符是“[root@localhost ~]#”,表示当前所在目录就是家目录。而我当前是超级用户,所以我的家目录就是/root/。
在建立每个用户的时候,系统会默认给每个用户建立一个邮箱。这个邮箱在/var/spool/mail/目录中,如lamp用户的邮箱就是/var/spool/mail/lamp。
刚刚我们说了每个用户都有一个家目录,比如lamp用户的家目录就是/home/lamp/,我们进入这个目录,看看里面有什么内容。
[root@localhost ~]# cd /home/lamp/
[root@localhost lamp]# ls
[root@localhost lamp]#
这个用户因为是新建立的,所以家目录中没有保存任何文件,是空的。但真的是空的吗?有没有隐藏文件呢?我们再来看看。
[root@localhost lamp]# ls -a
. .. .bash_logout .bash_profile .bashrc .gnome2
原来这个目录中还是有文件的,只不过这些文件都是隐藏文件。那么这些文件都是做什么的?是从哪里来的呢?这些文件都是当前用户lamp的环境变量配置文件,这里保存的都是该用户的环境变量参数。那么,什么是环境变量配置文件呢?我们这么说吧,在Windows中虽然只有一台计算机,但是如果使用不同的用户登录,那么每个用户的操作环境(如桌面背景、分辨率、桌面图标)都是不同的。因为每个用户的操作习惯不同,所以Windows运行用户自行定义的操作环境。在Linux中可以吗?当然可以,只不过Windows是通过更直观的图形界面来进行设置和调整的,而Linux是通过文件来进行调整的。我们将这些根据用户习惯调整操作系统环境的配置文件称作环境变量配置文件。/home/lamp/目录中的这些环境变量配置文件所定义的操作环境只对lamp用户生效,其他每个用户的家目录中都有相应的环境变量配置文件。
添加用户的命令是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: 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的
如果我们只是创建用户,则可以不使用任何选项,系统会按照默认值帮我们指定这些选项,只需要最简单的命令就可以了。命令如下:
[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/spool/mail/lamp
-rw-rw---- 1 lamp mail 0 1月 6 00:19 /var/spool/mail/lamp
注意这两个文件的权限,都要让lamp用户拥有相应的权限。
大家看到了吗?useradd命令在添加用户的时候,其实就是修改了我们在前面介绍的7个文件或目录,那么我们可以通过手工修改这些文件来添加或删除用户吗?当然可以了,我们在后面会演示如何通过手工修改文件来删除用户。那什么时候需要手工建立用户?什么时候需要用命令建立用户?其实在任何情况下都不需要手工修改文件来建立用户,我们用命令来建立用户既简便又快捷。我们在这里只是为了说明Linux中的所有内容都是保存在文件中的。
刚刚我们在添加用户的时候全部采用的是默认值,那么我们使用选项来添加用户会有什么样的效果?
例子2:
[root@localhost ~]# groupadd lamp1
#先手工添加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:lamp1:x:502:
#GID为502的组是lamp1组
[root@localhost ~]# ll -d /home/lamp1/
drwx------ 3 lamp1 lamp14096 1月 6 01:13 /home/lamp1/
#家目录也建立了,不需要手工建立
例子有点复杂,其实如果可以看懂还是很简单的,就是添加了用户,但是不再使用用户的默认值,而是手工指定了用户的UID(是550,而不再是501)、初始组、附加组、家目录、用户说明和用户登录Shell。这里还要注意一点,虽然手工指定了用户的家目录,但是家目录不需要手工建立,在添加用户的同时会自动建立家目录。如果手工建立了家目录,那么一定要修改目录的权限和从/etc/skel/模板目录中复制环境变量文件,反而更加麻烦。
大家发现了吗?在添加用户时,其实不需要手工指定任何内容,都可以使用useradd命令默认创建,这些默认值已经可以满足我们的要求。但是useradd命令的这些默认值是保存在哪里的呢?能否手工修改呢?
useradd命令在添加用户时参考的默认值文件主要有两个,分别是/etc/default/useradd和/etc/login.defs。我们先看看/etc/default/useradd文件的内容:
[root@localhost ~]# vi /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost ~]#passwd [选项] 用户名
选项:
-S: 查询用户密码的状态,也就是/etc/shadow文件中的内容。仅root用户可用
-l: 暂时锁定用户。仅root用户可用
-u: 解锁用户。仅root用户可用
--stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
[root@localhost ~]#passwd
#passwd直接回车代表修改当前用户的密码
下面举几个例子,我们给新用户lamp设定密码,让lamp用户可以登录系统:
例子1:
[root@localhost ~]# passwd lamp
更改用户 lamp 的密码 。
新的 密码: ← 输入新密码
无效的密码: WAY 过短 ← 有报错提示
无效的密码: 过于简单
重新输入新的 密码: ← 第二次输入密码
passwd: 所有的身份验证令牌已经成功更新。
注意,要想给其他用户设定密码,只有两种用户可行:一种是root用户;另一种是root通过sudo命令赋予权限的普通用户。也就是说,普通用户只能修改自己的密码,而不能设定其他用户的密码。
还要注意一件事,设定用户密码时一定要遵守“复杂性、易记忆性、时效性”的密码规范。简单来讲就是密码要大于8位,包含大写字母、小写字母、数字和特殊符号中的3种,并且容易记忆和定期更换。但是root用户在设定密码时却可以不遵守这些规则,比如我刚刚给lamp用户设定的密码是“123”,系统虽然会提示密码过短和过于简单,但是依然可以设置成功。不过普通用户在修改自己的密码时,一定要遵守密码规范。当然,在生产服务器上,就算是root身份,在设定密码时也要严格遵守密码规范,因为只有好的密码规范才是服务器安全的基础。
那么我们看看普通用户lamp是如何修改密码的:
[lamp@localhost ~]$ whoami
lamp
#先看看我的身份
[lamp@localhost ~]$ passwd lamp1
passwd: 只有根用户才能指定用户名称
#尝试修改lamp1用户的密码,系统提示普通用户不能修改其他用户的密码
[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 099999 7 -1 (密码已设置,使用 SHA512 加密。)
#上面这行代码的意思是:
#用户名 密码设定时间(2013-01-06)密码修改间隔时间(0) 密码有效期(99999)
#警告时间(7) 密码不失效(-1)
“-S”选项会显示出密码状态,这里的密码修改间隔时间、密码有效期、警告时间、密码宽限时间其实分别是/etc/shadow文件的第四、五、六、七个字段的内容。当然,passwd命令是可以通过命令选项修改这几个字段的值的,不过我个人认为还是直接修改/etc/shadow文件简单一些。再次提醒一下,CentOS 6.3的加密方式已经从MD5加密更新到SHA512加密,我们不用了解具体的加密算法,只要知道这种加密算法更加可靠和先进就足够了。
使用passwd命令可以很方便地锁定和解锁某个用户,我们来试试:
[root@localhost ~]# passwd -l lamp
锁定用户 lamp 的密码 。
passwd: 操作成功
#锁定用户
[root@localhost ~]# passwd -S lamp
lamp LK 2013-01-06 099999 7 -1 (密码已被锁定。)
#用“-S”选项查看状态,很清楚地提示密码已被锁定
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:! ! $6$ZTq7o/9o$ljO7iZObzW.D1zBa9CsY43dO4onskUCzjwiFMNt8PX4GXJoHX9zA1SC9.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 099999 7 -1 (密码已设置,使用 SHA512 加密。)
#锁定状态消失
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:$6$ZTq7o/9o$ljO7iZObzW.D1zBa9CsY43dO4onskUCzjwiFMNt8PX4GXJoHX9zA1SC9.iYz
h9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7:::
#密码前面的“! ! ”删除了
这种做法主要是在批量添加用户时,给所有的用户设定一个初始密码。但是需要注意的是,这样设定的密码会把密码明文保存在历史命令中,会有安全隐患。所以,如果使用了这种方式修改密码,那么应该记住两件事情:第一,手工清除历史命令;第二,强制这些新添加的用户在第一次登录时必须修改密码(具体方法参考“chage”命令)。
[root@localhost ~]# echo "123" | passwd --stdin lamp
更改用户 lamp 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
命令很简单,调用管道符,让echo的输出作为passwd命令的输入,就可以把lamp用户的密码设定为“123”了。
在添加了用户之后,如果不小心添加错了用户的信息,那么是否可以修改呢?当然可以了,我们可以直接使用编辑器修改用户相关文件,也可以使用usermod命令进行修改。我们就来学习一下usermod命令。该命令的格式如下:
[root@localhost ~]#usermod [选项] 用户名
选项:
-u UID: 修改用户的UID
-d 家目录: 修改用户的家目录。家目录必须写绝对路径
-c 用户说明: 修改用户的说明信息,就是/etc/passwd文件的第五个字段
-g 组名: 修改用户的初始组,就是/etc/passwd文件的第四个字段
-G 组名: 修改用户的附加组,其实就是把用户加入其他用户组
-s shell: 修改用户的登录Shell。默认是/bin/bash
-e 日期: 修改用户的失效日期,格式为“YYYY-MM-DD”。也就是/etc/shadow
文件的第八个字段
-L: 临时锁定用户(Lock)
-U: 解锁用户(Unlock)
可以看到,usermod和useradd命令的选项非常类似,因为它们都是用于定义用户信息的。不过需要注意的是,useradd命令用于在添加新用户时指定用户信息,而usermod命令用于修改已经存在的用户的用户信息,千万不要搞混。
usermod命令多出了几个选项,其中,-L可以临时锁定用户,不让这个用户登录。其实锁定的方法就是在/etc/shadow文件的密码字段前加入“!”。大家已经知道密码项是加密换算的,所以加入任何字符都会导致密码失效,所以这个用户就会被禁止登录。而解锁(-U)其实就是把密码字段前的“!”取消。
通过chage命令可以查看和修改/etc/shadow文件的第三个字段到第八个字段的密码状态。我个人建议直接修改/etc/shadow文件更加直观和简单,那么为什么还要讲解chage命令呢?因为chage命令有一种很好的用法,就是强制用户在第一次登录时必须修改密码。chage命令的格式如下:
[root@localhost ~]#chage [选项] 用户名
选项:
-l: 列出用户的详细密码状态
-d 日期: 密码最后一次修改日期(/etc/shadow文件的第三个字段),格式为YYYY-MM-DD
-m 天数: 密码的两次修改间隔时间(第四个字段)
-M 天数: 密码的有效期(第五个字段)
-W 天数: 密码修改到期前的警告天数(第六个字段)
-I 天数: 密码过期后的宽限天数(第七个字段)
-E 日期: 账号失效时间(第八个字段),格式为YYYY-MM-DD
这个命令比较简单,就是删除用户。命令格式如下:
[root@localhost ~]# userdel [-r] 用户名
选项:
-r: 在删除用户的同时删除用户的家目录
例如:
[root@localhost ~]# userdel –r lamp
在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件。
前面我们说过,可以手工修改用户的相关文件来建立用户,但在实际工作中,这样做没有实际的意义,因为用户管理命令可以更简单地完成这项工作。在学习时,手工添加用户是有助于加深我们对用户相关文件的理解的。不过手工添加用户还是比较麻烦的,我们变通一下,手工删除用户,原理是一样的,能够手工删除当然也可以手工建立。
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立lamp用户
[root@localhost ~]# vi /etc/passwd
lamp:x:501:501::/home/lamp:/bin/bash ← 删除此行
#修改用户信息文件,删除lamp用户行
[root@localhost ~]# vi /etc/shadow
lamp:$6$KoOYtc0J$56Xk9vp3D2vMRBxibNOn.21cVJ9onbW8lHx4WrOx6qBqfGa9U3mjMsGjqYnj
L/4t3zt3YxElce2X8rbb12x4a0:15716:0:99999:7::: ← 删除此行
#修改影子文件,删除lamp用户行。注意:这个文件的权限是000,所以要强制保存
[root@localhost ~]# vi /etc/group
lamp:x:501: ← 删除此行
#修改组信息文件,删除lamp组的行
[root@localhost ~]# vi /etc/gshadow
lamp:! :: ← 删除此行
#修改组影子文件,删除lamp组的行。同样注意需要强制保存
[root@localhost ~]# rm -rf /var/spool/mail/lamp
#删除用户邮箱
[root@localhost ~]# rm -rf /home/lamp/
#删除用户的家目录
#至此,用户彻底删除,再新建用户lamp。如果可以正常建立,则说明我们手工删除干净了
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立同名用户,没有报错,说明前面的手工删除是可以完全删除用户的
这个实验很有趣吧,不过命令比较多,大家通过这个实验应该可以清楚地了解到这几个用户相关文件的作用。
id命令可以查询用户的UID、GID和附加组的信息。命令比较简单,格式如下:
[root@localhost ~]# id 用户名
例子1:
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp)
#能看到uid(用户ID)、gid(初始组ID), groups是用户所在组,这里既可以看到初始组,如果有附加
组,则也能看到附加组
例子2:
[root@localhost ~]# usermod -G root lamp
#把用户加入root组
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root)
#大家发现root组中加入了lamp用户的附加组信息
su命令可以切换成不同的用户身份,命令格式如下:
[root@localhost ~]# su [选项] 用户名
选项:
-: 选项只使用“-”代表连带用户的环境变量一起切换
-c 命令: 仅执行一次命令,而不切换用户身份
“-”不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。大家知道环境变量是用来定义用户的操作环境的,如果环境变量没有随用户身份切换,那么很多操作将无法正确执行。比如普通用户lamp切换成超级用户root,但是没有加入“-”,那么虽然是root用户,但是 P A T H 环境变量还是 l a m p 用户的,不包含 / s b i n 、 / u s r / s b i n 等超级用户命令保存路径,所以无法使用管理员命令;而且 r o o t 用户在接收邮件时,还会发现收到的是 l a m p 用户的邮件,因为环境变量 PATH环境变量还是lamp用户的,不包含/sbin、/usr/sbin等超级用户命令保存路径,所以无法使用管理员命令;而且root用户在接收邮件时,还会发现收到的是lamp用户的邮件,因为环境变量 PATH环境变量还是lamp用户的,不包含/sbin、/usr/sbin等超级用户命令保存路径,所以无法使用管理员命令;而且root用户在接收邮件时,还会发现收到的是lamp用户的邮件,因为环境变量MAIL没有切换过来。
[lamp@localhost ~]$ whoami
lamp
#查询用户身份,我是lamp
[lamp@localhost ~]$ su root
密码: ← 输入root密码
#切换到root,但是没有切换环境变量。注意:普通用户切换到root需要密码
[root@localhost ~]# env | grep lamp
#查看环境变量,提取包含lamp的行
USER=lamp
#用户名还是lamp,而不是root
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sb
in:/sbin:/home/lamp/bin
#命令查找的路径不包含超级用户路径
MAIL=/var/spool/mail/lamp
PWD=/home/lamp
LOGNAME=lamp
#邮箱、家目录、目前用户名还是lamp
通过例子1我们已经注意到,切换用户时如果没有加入“-”,那么切换是不完全的。要想完整切换,可以使用如下命令:
[lamp@localhost ~]$ su - root
密码:
#“-”代表连带环境变量一起切换,不能省略
有些系统命令只有root可以执行,比如添加用户的命令useradd,所以我们需要使用root身份执行。但是我们只想执行一次,而不想切换身份,可以做到吗?当然可以,命令如下:
[lamp@localhost ~]$ whoami
lamp
#当前我是lamp
[lamp@localhost ~]$ su - root -c "useradd user1"
密码:
#不切换成root,但是执行useradd命令添加user1用户
[lamp@localhost ~]$ whoami
lamp
#我还是lamp
[lamp@localhost ~]$ grep "user1" /etc/passwd
user1:x:502:504::/home/user1:/bin/bash
#user1用户已经添加了
总之,切换用户时“-”代表连带环境变量一起切换,不能省略,否则用户身份切换不完全。
添加用户组的命令是groupadd,命令格式如下:
[root@localhost ~]# groupadd [选项] 组名
选项:
-g GID:指定组ID
添加用户组的命令比较简单,举个例子:
[root@localhost ~]# groupadd group1
#添加group1组
[root@localhost ~]# grep "group1" /etc/group
group1:x:502:
groupmod命令用于修改用户组的相关信息,命令格式如下:
[root@localhost ~]# groupmod [选项] 组名
选项:
-g GID: 修改组ID
-n 新组名: 修改组名
例子:
[root@localhost ~]# groupmod -n testgrp group1
#把组名group1修改为testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:502:
#注意GID还是502,但是组名已经改变
不过大家还是要注意,用户名不要随意修改,组名和GID也不要随意修改,因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名,则建议大家先删除旧的,再建立新的。
groupdel命令用于删除用户组,命令格式如下:
[root@localhost ~]#groupdel 组名
例子:
[root@localhost ~]#groupdel testgrp
#删除testgrp组
不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响。
其实gpasswd命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被sudo命令取代,所以gpasswd命令现在主要用于把用户添加进组或从组中删除。命令格式如下:
[root@localhost ~]# gpasswd 选项 组名
选项:
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除
举个例子:
[root@localhost ~]# groupadd grouptest
#添加组grouptest
[root@localhost ~]# gpasswd -a lamp grouptest
Adding user lamp to group grouptest
#把用户lamp加入grouptest组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
grouptest:x:505:lamp
#查看一下,lamp用户已经作为附加用户加入grouptest组
[root@localhost ~]# gpasswd -d lamp grouptest
Removing user lamp from group grouptest
#把用户lamp从组中删除
[root@localhost ~]# grep "grouptest" /etc/group
grouptest:x:505:
#组中没有lamp用户了
大家注意,也可以使用usermod命令把用户加入某个组,不过usermod命令的操作对象是用户,命令是“usermod -G grouptest lamp”,把用户名作为参数放在最后;而gpasswd命令的操作对象是组,命令是“gpasswd -a lamp grouptest”,把组名作为参数放在最后。
推荐大家使用gpasswd命令,因为这个命令不仅可以把用户加入用户组,也可以把用户从用户组中删除。
我们说过,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?当然是初始用户组的组身份生效了,因为初始组是用户一旦登录就直接获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令newgrp就可以切换用户的有效组。命令格式如下:
[root@localhost ~]# newgrp 组名
举个例子,我们已经有了普通用户lamp,默认会建立lamp用户组,lamp组是lamp用户的初始组。我们再把lamp用户加入group1组,那么group1组就是lamp用户的附加组。当lamp用户创建文件test1时,test1文件的属组是lamp组,因为lamp组是lamp用户的有效组。通过newgrp命令就可以把lamp用户的有效组变成group1组,当lamp用户创建文件test2时,就会发现test2文件的属组就是group1组。命令如下:
[root@localhost ~]# groupadd group1
#添加组group1
[root@localhost ~]# gpasswd -a lamp group1
Adding user lamp to group group1
#把lamp用户加入group1组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
group1:x:503:lamp
#lamp用户既属于lamp组,也属于group1组
[root@localhost ~]# su – lamp
#切换成lamp身份,超级用户切换成普通用户不用密码
[lamp@localhost ~]$ touch test1
#创建文件test1
[lamp@localhost ~]$ ll test1
-rw-rw-r-- 1 lamp lamp 0 1月 14 05:43 test1
#test1文件的默认属组是lamp组
[lamp@localhost ~]$ newgrp group1
#切换lamp用户的有效组为group1组
[lamp@localhost ~]$ touch test2
#创建文件test2
[lamp@localhost ~]$ ll test2
-rw-r--r-- 1 lamp group1 0 1月 14 05:44 test2
#test2文件的默认属组是group1组
通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件时哪个组身份生效。使用newgrp命令可以在多个组身份之间切换。