在之前多篇文章中,我们反复的提到过普通用户和 root用户的一些区别。也多多少少涉及了多用户和用户组的概念
如果你是初学者,不出意外你一直使用的应该都是 root用户(俺也一样);那前面说到的普通用户可能会存在的问题,你应该大部分都不会碰到。
但仅限于在你自己的电脑中,以后工作的话你就不一定能拿到 root用户了。
root用户作为管理员账户 拥有系统的最高权限,工作中自然是不会人手一个,那就失去了意义 而且不安全 …
管理员的工作中相当重要的一环就是管理账户,普通用户的创建都需要经过管理员的协助
所以无论你以后工作拿不拿得到 root用户,本篇文章对你来说都尤为重要;先让我们了解 Linux是如何辨别每一个用户的。
虽然我们一般登录 Linux都使用的是用户名加密码方式,但其实 Linux并不能直接辨别各个账户的用户名。
Linux辨别用户靠的是用户的 ID,所谓的用户名对 Linux来说没什么意义;只是为了方便人来记忆和区分。
我们可以做个小测试:
如下,我的 /home目录下存在着属于我自己(moluu)的工作目录;
如果你是初学者,还不清楚如何创建用户可以使用
cat /etc/passwd
,在该文件中随便选一个用户;为该用户在
/home
目录下新建工作目录,将原本的属主和属组修改为该用户
我创建该工作目录时使用的是 root用户(现在也是),所以默认该工作目录的所属者和所属用户组为 root root。
但我对其都进行了修改,此时该工作目录的所属用户和所属用户组改变为了 moluu moluu
[root@izbp1az353cisf510keg74z home]# ll
total 4
drwxr-xr-x 2 moluu moluu 4096 Jan 2 21:06 moluu
我们使用 vim /etc/passwd
命令,打开我们的用户信息存放文件,并对 moluu用户进行修改
我们将用户 id进行修改,看看 Linux的反应如何
# 将我自己所属账号的 用户ID修改为 1001
moluu:x:1001:1000::/home/moluu:/bin/bash
修改完成后再次使用 ll
命令,查看工作目录 moluu
所属的用户和 用户组
可以看到,之前的 moluu(也就是该目录的所属用户)变成了 “1000”;
为什么会如此呢?
很简单 就如前面所说的,Linux其实只认识 用户的ID(以下简称为 UID);
我们使用 chown
命令时写的 用户名参数;Linux并不认识,它会根据这个参数在 /etc/passwd
中寻找对应的 UID。
Linux会将这个 UID作为该目录的所属用户信息记录在这个目录中,而不是将我们使用的 用户名参数作为 该目录所属用户信息进行记录。
而我们对 UID"1000"进行了修改,/etc/passwd
中就不存在 UID"1000",Linux也就无法从 /etc/passwd
中找到 UID"1000"对应的用户名
找不到记录 UID对应的用户名怎么办呢?还能怎么办 把记录的 UID显示出来呗,文件总得有个属主吧。(使用 chown
命令修改用户的属主时,如果写的用户参数为 UID;即便不存在该 UID也不会报错,所以显示文件的属主为一个 不存在的 UID是允许的)
我们将原本修改的 UID"1001"改回 “1000”;
该目录记录的 UID能够找到对应的用户名后,会恢复正常 继续显示记录 UID对应的用户名
用户 UID和工作目录记录的 UID对不上是很严重的事情,如果该目录的权限还是 “7 0 0”,那么你下次登录时甚至没办法进入自己的家目录。
怎么办呢?只能麻烦管理员帮忙修改一下属主了 ╮(╯-╰)╭
所以权限和 用户相关一定要学好啊,不然碰到这种误操作的情况还是蛮致命的。
使用账户登录 Linux系统是十分简单的事情,虽然登录简单 但不代表背后的东西也很简单
我们先来了解一下 Linux账号的登录流程:
/etc/passwd
中是否存在,如果存在则将对应的 UID和 GID(GroupID 即用户组ID)、家目录、shell设置一并读出;如果不存在则退出。/etc/shadow
中寻找对应 UID的加密密码,将该加密密码和你输入的密码进行对比从上述登录流程我们能够得知 与用户账号相关的文件有两个,这两个文件主要存储 用户的UID、GID和加密后的密码。
对这两个文件的充分理解有助于我们之后的学习
我们先来看看这个目录的结构是什么样子的
可以看到,每一行对应的是一个账户,账户的信息使用 " : " 分隔
除了我们一直在使用的 root账户和刚刚创建的 个人账户(moluu),还存在着一大堆的其他账户;
这些账户是 Linux系统运行时所必需的账户,为避免出现修电脑或系统异常,建议不要对其进行改动。
我们把视野放到第一行 也就是我们一直在使用的 root用户
root:x:0:0:root:/root:/bin/bash
这一行中有七个字段,字段之间都使用 " : "分隔
我们依次来对这七个字段进行解释
显而易见,第一个字段是用户名 需要用来对应 UID,也就是第三条字段
所有的账户信息的第二个字段都是 " x ",这个字段原本存放的是对应用户密码。
/etc/shadow
,因此你只能看到 一个 " x "这个字段是用户的 UID,十分关键。
UID区间 | 该 UID区间用户的特性 |
---|---|
0(系统管理员) | 当用户的 UID为0时,代表这个账号具备管理员权限;系统允许除 root 外还存在其他管理员,但并不建议这么做。 |
1~999(系统账号) | 保留给系统使用的 UID;默认 1000以下的数字留给系统作为保留账号只是一个习惯。这些特殊的账号默认是不可登录的,通常 1-200指的是 Linux发行版自行建立的系统账号,201~999 是用户有系统账号需求时可建立的 UID区间 |
1000~60000(可登录的账号) | 一般用户使用的 UID区间;事实上 目前的Linux内核(3.10.x)已经支持到 4294967295 (2^32-1)了 |
我们知道很多程序的运行都与权限有关,读取当前用户的权限需要先读取该用户的 UID和GID;
因为 UID和 GID需要被频繁读取,所以存放它们的文件/etc/passwd
设置的权限必须为所有人可读。
前面提到早期的用户密码也存放于/etc/passwd
中,虽然是以被加密的形式存放在第三个字段,但所有人可读后还是有所隐患。
因此 密码被单独存放在了 /etc/shadow
中,我们先来看看该文件的构造
同 /etc/passwd
一样,/etc/shadow
也以 " : "作为分隔符,数一数应该能够发现 存在九个字段。
同样的我们也需要对这九个字段进行分解
毋庸置疑第一个字段为账号名称;密码不可能脱离账号名称单独存在,因此需要和 /etc/passwd下的账户名称有所对应。
密码;这个字段的数据才是真实的密码,而且是经过了编码的密码 你只会看到一些特殊字符和字母数字。
密码最后修改时间;可以看到大部分密码的最后修改时间都是 16659
密码再次修改需要等待的天数;这个字段限制了对应账号密码修改的 cd,防止没事瞎折腾把密码给忘了,如果为 0表示随时可以修改。
密码需要修改的天数;经常改密码未必是个好习惯,但从来不改肯定是个坏习惯。防人之心不可无,这个字段规定了你再多少天之内必须修改一次密码。
密码需要修改期限的警告天数;也就是设置了 第五个字段后,你可以设置该字段在密码过期前对你进行提醒
密码过期后的账号宽限时间;该字段可以允许你在多少时间内仍可以继续使用过期密码登录账号
账号失效日期;该字段可以设置账号失效的时间(也是使用的 1970/1/1到某一天的总天数形式),设置后 在指定时间到来时,无论账号的密码是正常或过期,该账号都将无法使用。
这个字段为保留字段,看以后有没有新功能加入
其实一般这些密码忘记了都不要紧,只要记得 root账户的密码即可。
其他用户的密码你都可以通过 root账户来执行重置操作,如果 root账户密码忘记了 emmm(这题我不会啊,但其实是可以通过一些特定手法来解决该问题的)
用户组能够保证多个团队在一个 Linux系统下工作时,各个团队之间的数据保密性。
将用户进行组与组的划分,是十分有必要的
在 Linux中有一个文件专门用来存放用户组,即 /etc/group
同上,我们需要对这个文件结构进行认识
这个文件的结构比较简单,字段也不是很多 理解起来也比较轻松。
我们对这些字段进行一个分解
/etc/gshadow
中,因此此字段你只能看到一个 " x "。/etc/passwd
中的第四个字段虽然一个用户可以加入多个用户组,但当我们使用该用户进行工作时;创建的文件和目录所属用户组并不会因为该用户加入了多个用户组而受影响,这就涉及到所谓的有效用户组了
一般来说每一个用户在 /etc/passwd
文件中的第四个字段都会存在一个 GID,这个 GID是该用户的初始用户组(initial group)
每当用户登录 Linux系统时,立刻就会获得这个用户组的相关权限。
初始用户组在用户登录时就已经主动获取了,所有不需要去 /etc/group
修改第四个参数;而非初始用户组就需要手动添加了。
我们通过 groups
可以看到当前用户所支持的全部用户组,追加一个用户名参数 可以查看指定用户所支持的全部用户组
[root@izbp1az353cisf510keg74z ~]# groups moluu
# moluu用户所支持的全部用户组有 它的初始用户组和 root用户组
moluu : moluu root
返回信息的 第一个用户组为有效用户组;
当我们创建文件或目录时 文件或目录的所属用户组会以当前创建用户的有效用户组为准
有效用户组是可以被切换的,我们可以使用
newgrp
命令来选择一个支持的用户组进行有效用户组的切换。 使用该命令需要使用另一个 shell,在该命令执行后需要使用
exit
退出该 shell 返回原本的 shell
前文提到该文件中存放了 用户组真实的密码;这个文件的结构和 /etc/group
类似,也是四个字段
需要特别注意的是第二个字段,如果这个字段为空或者是 " ! "表示该用户组没有管理员。
第二第三个字段为 用户组管理员和支持该用户组的用户
以系统管理员的角度来说,该文件最大的作用就是设立用户组管理员
用户组管理员有权限使普通用户加入它所管理的用户组,即分担 root用户的压力。
但现在有类似 sudo之类的工具,用户组管理员功能使用得也就越来越少了;我们在后续的 gpasswd
中会介绍这方面的内容
讲了这么多铺垫,终于到了大家感兴趣的环节,用户的添加删除与修改。
我们一个一个说,虽然都不用大费笔墨 但我还是会讲得连初学者也能够看懂。
添加用户十分简单,我们可以使用 useradd
命令;使用该命令至少需要追加一个 用户名参数。
其他七七八八的选项其实都可以省略,虽然可以省略但讲还是要讲的:
/etc/passwd
的第四个字段/etc/group
中的相关内容/etc/passwd
中第五个字段;可以看心情写点啥/bin/bash
/etc/shaodw
中的第八个字段,也就是账号失效时间可以使用的选项有这么多,而我们添加用户时 仅追加用户名参数就能够完成用户的创建;可想而知系统存在许多的默认值。
一部分默认值可以使用 useradd -D
来查看
[root@izbp1az353cisf510keg74z ~]# useradd -D
# 新建账号的初始用户组 GID为 100,即 users
GROUP=100
# 用户的家目录通常与用户名一致,且会存在于该值的目录后
# 即 moluu用户的家目录默认会是 /home/moluu
HOME=/home
# -1表示 该用户密码过期后不会立即失效
INACTIVE=-1
# 账号失效的日期,为空表示不会自然失效
EXPIRE=
# 默认的 shell程序
SHELL=/bin/bash
# 用户家目录参考基准目录
SKEL=/etc/skel
# 表示默认建立 mailbox
CREATE_MAIL_SPOOL=yes
这些数据其实是存在于 /etc/default/useradd
中的,你可以使用 vim查看一下
这里的 GROUP在我使用的 CentOS中并不会生效,CentOS默认的用户组会和 用户名一致 GID也会与 UID一致
这里需要补充一点东西,即"私有用户组机制"和"公有用户组机制"
系统会建立一个和用户名同名的 用户组,来作为该用户的初始用户组;
这种用户组的设置机制会比较有保密性,这是因为用户都有自己的用户组,而且家目录的权限默认为 700
即除自己外其他人不可访问。
使用这种机制后,将不会考虑 GROUP=100这个设置值;代表性的发行版本有 RHEL、Fedora、CentOS等。
这种机制会使用 GROUP=100这个设置值,因此每个新建账号的初始用户组都为 users。
且默认家目录的权限通常会是 “731”,这种机制下所有用户都可以共享家目录内的数据;代表发行版本为 SUSE等。
当然,这些默认值并不是全部;我们还可以前往 /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 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
,所以moluu用户的mailbox目录为 /var/spool/mail/moluu
以 PASS_开头的设置
/etc/shadow
能够发现每一行第四、五、六个字段都为 [0:99999:7]UID_MIN
UID_MAX
这里需要注意的是,当我们新建用户且不追加 -u参数时;系统会前往 /etc/passwd
中寻找最大的 UID,将该 UID与 UID_MIN的值进行比对。
如果这个 UID比 UID_MIN的值小,则系统会使用 UID_MIN的值来作为 新建用户的UID
如果这个 UID比 UID_MIN的值大(或相等),则系统会在该 UID的基础上 +1,将这个 +1后的 UID作为新建用户的 UID
剩下的 SYS_UID_MIN和 SYS_UID_MAX是系统用户相关,不扩展;GID相关和 UID一样,不多赘述
如果要说一个账号什么最关键,毫无疑问是 密码。
而我们在添加用户时并没有任何选项和密码相关,也就导致了我们创建的用户 密码其实都为空。
虽然没有密码,但系统仍会将该用户的密码相关参数写入到 /etc/shadow
中,即便写入的密码数据为空。
写入后 /etc/shadow
文件中仅有密码参数,而不存在加密过的密码数据;
这种情况呢,我们创建的用户会被锁定,即 无法使用该账号来完成登录。
所以我们还需要使用 passwd
命令来为创建的用户设置密码,设置完密码才算正式的完成了用户的创建。
如果单独使用
passwd
命令表示修改自己的密码,如果你当前使用的是 root用户 即 修改 root用户的密码如果新建用户后,要为新用户创建密码,则用
passwd 用户名
,注意要以root用户的权限来创建。
# 使用 passwd命令为 moluu用户设置密码
[root@izbp1az353cisf510keg74z ~]# passwd moluu
Changing password for user moluu.
# 会提示你输入新的密码,出于安全考虑 你输入的密码是不可见的(甚至位数都看不见)
# 输入密码需要遵循规范,不能过短也不能有非法字符
New password:
# 按下回车后出现 Retype字样表示你的密码合法,再次输入该密码可以完成密码的修改
Retype new password:
# 返回该提示表示密码设置成功
passwd: all authentication tokens updated successfully.
passwd
命令还有一些比较常用的选项 比如 -l
选项,在修改密码时使用 -l
选项可以让指定用户的密码不合法;即 锁定账号(lock)
# 追加 -l选项,使指定用户的账户锁定
[root@izbp1az353cisf510keg74z ~]# passwd -l moluu
该命令执行后对应用户在 /etc/shadow
中第二个字段 即加密后的密码会被修改为 " ! ",也就是不合法的意思
如果想解开可以再使用 -u选项 (unlock)
# 追加 -u选项,使指定账号解锁
[root@izbp1az353cisf510keg74z ~]# passwd -u moluu
到这里用户的创建就告一段落,虽然操作起来很简单,但背后要了解的东西还是蛮多的
一般来说"增删改查"中的 删都是比较简单的 在 Linux中也是一样,删除账号十分容易;
删除用户使用 userdel
命令,通常我们要删除一个账号可以手动将 /etc/passwd
与 /etc/shadow
里面的账号取消。
如果账号只是暂时不启用,我们将其 /etc/shadow中第八个字段设置为 0即可;
虽然设置后该账号无法使用,但与该账号相关的数据会保留下来。
userdel
的实际应用场景一般是你 确定真的不让该用户在主机上使用任何资源时
示例:
userdel linuxde # 删除用户linuxde,但不删除其家目录及文件;
userdel -r linuxde # 删除用户linuxde,其家目录及文件一并删除;
不要轻易用-r
选项;他会在删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
俗话说 人有失手,在创建用户时难免会有一些误操作或你存在特定需求;导致需要修改当前用户的一些数据和信息。
修改用户的信息除了下面要说到的 usermod
命令,我们还可以直接进到 /etc/passwd
和 /etc/shadow
中直接修改。
这样做有好处也有坏处,好处是比较方便 坏处则是有点不安全。
这两个文件都是极为重要的文件,所以能用命令的话 就不建议手动对其进行修改了。
usermod
命令的使用没什么难度,唯一需要多费些口舌的就是它的选项;
它的选项也及其多,但我把他放到这个位置来讲后,你已经看一眼都能够理解了。
usermod命令的一些选项:
/etc/passwd
中的第五个字段内容/etc/passwd
中的第六个字段内容/etc/shadow
的第八个字段内容/etc/shadow
的第七个字段内容/etc/passwd
中的第四个字段(GID)/etc/group
中的内容/etc/passwd
的第一个字段/etc/passwd
的第三个字段(尽量为 1000+的非重复UID)/etc/shadow
的第二个字段也就是将密码设置为 " ! "/etc/shadow
第二个字段的 " ! "会被拿掉,即 将该账号解锁其大部分选项都和 useeadd
命令类似,唯一不同的是 -L
与 -U
;但实际上还是和 passwd
命令中的 -l
、-u
没什么区别
理解起来基本上没有太多成本,但需要注意的是 这两个选项未必会在所有的 Linux发行版本上都存在。
一部分示例:
# 使用 -c选项将指定字符串作为账号说明,即写入 /etc/passwd中第五个字段
[root@izbp1az353cisf510keg74z ~]# usermod -c "我的私人账号" moluu
# ------------------------------------------------------------
# /etc/passwd
moluu:x:1000:1000:我的私人账号:/home/moluu:/bin/bash
# 使用 -e选项将该账号的过期时间设置为 2030年最后一天,即 写入 /etc/shadow中第八个字段
[root@izbp1az353cisf510keg74z ~]# usermod -e "2030/12/31" moluu
# --------------------------------------------------------------
# /etc/shadow;22279 为 2030年最后一天
moluu:*/p./:18631:0:99999:7::22279:
# 将用户 moluu的家目录修改为 /home/test
[root@izbp1az353cisf510keg74z ~]# usermod -md /home/test lutixiaya
# -aG参数同时使用表示 将 moluu用户加到 root组
[root@izbp1az353cisf510keg74z ~]# usermod -aG root moluu
# 将用户名 "moluu"修改为 "newMoluu"
[root@izbp1az353cisf510keg74z ~]# usermod -l newMoluu moluu
了解完了账号的增删改,我们紧接着来看看用户组的增删该;
和学习账号的增删该一样,无非是学习一些命令的使用和选项的解释,还有一些可有可无的扩展。
我们一个一个看
想新增一个用户组我们可以使用 groupadd
命令,该命令的使用不会很难;我们直接通过演示来了解
新建 test用户组,该用户组的 GID为350
groupadd -g 350 test
一般来说建立用户组我们能用到的参数仅有 -g
和 -r
-g
选项可以让我们指定用户组创建时的 GID;-r
则表示建立的用户组为系统用户组
如果不指定 GID,默认也会和 UID的默认值一致
新建用户组时的 GID的规范和 UID有所不同,曾经有一些教育培训手册谈到:为了使用户的 UID和初始用户组的 GID成对,建议新建与用户无关的私有用户组时 使用小于 1000的 GID为宜。
也就是说,如果要建立用户组的话最好使用 -r
选项(因为系统用户组的默认最大 GID为 1000)
不过这就见仁见智了,看你自己的选择 都可以。
想修改用户组的信息和数据可以使用 groupmod
命令,该命令和 usermod
类似 但简单很多(其实用户组的增删改都很简单)
我们仍然通过示例来先了解
# 使用 groupmod命令对 test用户组进行修改,将其 GID修改为 351;组名修改为 newTest
groupmod -g 351 -n newTest test
毋庸置疑 -g
参数仍和 GID相关,在这里表示命令执行后的 GID,-n
则表示修改命令执行后的组名。
不过不是很建议总是修改 GID,容易造成系统资源的错乱
删除用户组使用 groupdel
命令,删除命令是最简单的;但用户组的删除需要你了解删除的用户组是否为空
如果是一个为空的用户组,则可以使用 groupdel 组名
的方式直接删掉。
如果不是你有两种方法使其为空
userdel
命令删除usermod
命令将该用户组中存在的用户移出需要删除的用户组哪种方式几看你自己的需求和想法了
如果管理员太忙了,没有空闲来处理用户组相关的问题,导致你想要加入某个用户组时只能干等着;
这个时候你就可以提议让管理员为用户组建立用户组管理员,用户组管理员来替代管理员处理用户组相关的问题。
用户组管理员拥有将其他账号加入或移除用户组的权限
我们先来看看如何设立用户组管理员
设立用户组管理员使用 gpasswd
命令,该命令也只能由 管理员使用。
一般情况下 管理员直接使用该命令加用户组名,是修改当前用户组的密码
[root@izbp1az353cisf510keg74z home]# gpasswd test
Changing the password for group test
New Password:
所以我们如果要为用户组设立管理员应该 追加 -A选项,除了 -A外还有一些其他选项需要了解
# 将 test用户组的管理权限交给 moluu用户
gpasswd -A moluu test
# 将用户 zhangsan lisi加入到 test用户组中
gpasswd -M zhangsan,lisi test
好了 现在 test用户组存在用户管理员了,而管理员添加或删除用户也是使用的 gpasswd
命令;只是参数有所改变
# 将用户 wangwu加入 test用户组
gpasswd -a wangwu test
# 将用户 zhangsan从 test用户组中删除
gpasswd -d zhangsan test