EdwardWong
2022/12/13阅读:27主题:姹紫
Linux之用户管理
Linux
是多用户多任务操作系统,换句话说,Linux
系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,Linux
正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
如果要使用 Linux
系统的资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统(账户和用户是一个概念)。通过建立不同属性的用户,一方面可以合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护
每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。
用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有 10 个用户的话,就需要授权 10 次.最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。
Linux
用户和组的关系
用户和组的关系:
-
一对一: 一个用户可以存在一个组中,是组中的唯一成员
-
一对多: 一个用户可以存在多个用户组中,此用户具有这多个组的共同权限
-
多对一: 多个用户可以存在一个组中,这些用户具有和组相同的权限
-
多对多: 多个用户可以存在多个组中。
Linux``UID
和GID
(用户id和组id)
登陆 Linux
系统时,虽然输入的是自己的用户名和密码,但其实 Linux
并不认识你的用户名称,它只认识用户名对应的 ID
号(也就是一串数字)。**Linux
系统将所有用户的名称与 ID
的对应关系都存储在 /etc/passwd 文件中**。
Linux
系统中,每个用户的 ID
细分为 2
种,分别是用户 ID(User ID
,简称 UID
)和组 ID(Group ID
,简称 GID
),这与文件有拥有者和拥有群组两种属性相对应
每个文件都有自己的拥有者 ID
和群组 ID
,当显示文件属性时,系统会根据 /etc/passwd
和 /etc/group
文件中的内容,分别找到 UID 和 GID 对应的用户名和群组名,然后显示出来。
有两个账户,分别为 root
超级管理员账户和 c.biancheng.net
普通账户,我们先使用 root
账号登陆并 Vim /etc/passwd
,在该文件中找到 c.biancheng.net
账户并将其 UID
随意改一个数字,这时当你查看普通账户拥有的文件时,你会发现所有文件的拥有者不再是 c.biancheng.net
,而是数字。
#查看系统中是否存在c.biancheng.net这个用户
[root@livecd ~]#grep 'c.biancheng.net' /etc/passwd
c.biancheng.net:x:500:500:c.biancheng.net:/home/centoslive:/bin/bash
[root@livecd ~]#ll -d /home/centoslive
drwx------. 23 c.biancheng.net centoslive 4096 Apr 9 09:37 /home/centoslive
[root@livecd ~]#vim /etc.passwd
#修改c.biancheng.net账户中的UID(第一个 500)为 2000
[root@livecd ~]#ll -d /home/centoslive
drwx------. 23 500 centoslive 4096 Apr 9 09:37 /home/centoslive
#可以看到,之前的 c.biancheng.net 变为了 500,因为修改了UID,导致 500 找不到对应的账号,因此显示数字
#记得最后将其再手动改正过来
[root@livecd ~]#vim /etc.passwd
#修改c.biancheng.net账户中的UID从 2000 改为 500
由于 c.biancheng.net
账户的 UID
已经改为 2000
,但其 home
目录却记录的是 500
,会导致此用户再次登录时无法进入自己的home
目录。
etc/passwd
文件
Linux
系统中的 /etc/passwd
文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
[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
...省略部分输出...
/etc/passwd
文件中每行记录对应一个用户。
Linux
系统中默认怎么会有这么多的用户?这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
每行用户信息都以 ":"
作为分隔符,划分为 7
个字段,每个字段所表示的含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
用户名
用户名,就是一串代表用户身份的字符串。
用户名仅是为了方便用户记忆,Linux
系统通过UID
来识别用户身份,分配用户权限的,/etc/passwd
文件中就定义了用户名和UID
之间的关系。
密码
"x"
表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow
文件中.
现在 Linux
系统把真正的加密密码串放置在 /etc/shadow
文件中,此文件只有 root
用户可以浏览和操作,这样就最大限度地保证了密码的安全。
需要注意的是,虽然 "x"
并不表示真正的密码,但也不能删除,如果删除了 "x"
,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
UID
UID
,也就是用户 ID
。每个用户都有唯一的一个 UID
,Linux
系统通过 UID
来识别不同的用户。
实际上,UID
就是一个 0~65535
之间的数,不同范围的数字表示不同的用户身份.

GID
全称“Group ID”
,简称“组ID
”,表示用户初始组的组 ID
号。
初始组,指用户登陆时就拥有这个用户组的相关权限。每个用户的初始组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的初始组。 比如说,我们手工添加用户 lamp
,在建立用户 lamp
的同时,就会建立 lamp
组作为 lamp
用户的初始组。
附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。 附加组可以有多个,而且用户可以有这些附加组的权限。
举例来说,刚刚的 lamp
用户除属于初始组 lamp
外,我又把它加入了 users
组,那么 lamp
用户同时属于 lamp
组和 users
组,其中 lamp
是初始组,users
是附加组。
在
/etc/passwd
文件的第四个字段中看到的ID
是这个用户的初始组。
描述性信息
这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已。
主目录
也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。
例如,root
超级管理员账户的主目录为 /root
,普通用户的主目录为 /home/yourIDname
,即在 /home/
目录下建立和用户名相同的目录作为主目录,如 lamp
用户的主目录就是 /home/lamp/
目录。
默认的shell
Shell
就是 Linux
的命令解释器,是用户和 Linux 内核之间沟通的桥梁。
用户登陆 Linux
系统后,通过使用 Linux
命令完成操作任务,但系统只认识类似 0101
的机器语言,这里就需要使用命令解释器。也就是说,Shell
命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常情况下,Linux
系统默认使用的命令解释器是 bash
(/bin/bash
),当然还有其他命令解释器,例如 sh
、csh
等.
在 /etc/passwd
文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是 bash
命令解释器,就代表这个用户拥有权限范围内的所有权限
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/bin/bash
我手工添加了 lamp
用户,它使用的是 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
),系统不会识别这些命令,同时也就意味着这个用户不能登录。
etc/shadow
影子文件
/etc/shadow
文件,用于存储 Linux
系统中用户的密码信息,又称为“影子文件”
/etc/passwd
文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux
系统将用户的密码信息从 /etc/passwd
文件中分离出来,并单独放到了此文件中/etc/shadow
,只有 root
用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
[root@localhost ~]#vim /etc/shadow
root: $6$9w5Td6lg
$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoom ff9isV1 PzdcXmixzhnMVhMxbvO:15775:0:99999:7:::
bin:*:15513:0:99999:7:::
daemon:*:15513:0:99999:7:::
…省略部分输出…
同 /etc/passwd
文件一样,文件中每行代表一个用户,同样使用 ":"
作为分隔符,不同之处在于,每行用户信息被划分为 9
个字段。每个字段的含义如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
用户名
加密密码
这里保存的是真正加密的密码。目前 Linux
的密码采用的是 SHA512
散列加密算法,原来采用的是 MD5
或 DES
加密算法。SHA512
散列加密算法的加密等级更高,也更加安全.
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上
"!"
、"*"
或"x"
使密码暂时失效。
所有伪用户的密码都是 "!!"
或 "*"
,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!"
,代表这个用户没有密码,不能登录。
最后一次修改时间
此字段表示最后一次修改密码的时间,可是,为什么 root 用户显示的是 15775 呢?
这是因为,Linux
计算日期的时间是以 1970 年 1 月 1
日作为 1
不断累加得到的时间,到 1971 年 1 月 1 日
,则为 366
天。这里显示 15775
天,也就是说,此 root
账号在 1970
年 1
月 1
日之后的第 15775
天修改的 root
用户密码。
可以使用如下命令进行换算:
date -d "1997-01-01 15775 days"

最小修改时间间隔
最小修改间隔时间,也就是说,该字段规定了从第 3
字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0
,则密码可以随时修改;如果是 10
,则代表密码修改后 10
天之内不能再次修改密码.
此字段是为了针对某些人频繁更改账户密码而设计的。
密码有效期
经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3
字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。 该字段的默认值为 99999
,也就是 273
年,可认为是永久生效。如果改为 90
,则表示密码被修改 90
天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。
密码需要变更前的警告天数
与第5
字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 "再过 n
天你的密码就要过期了,请尽快重新设置你的密码!
该字段的默认值是 7
,也就是说,距离密码有效期的第 7
天开始,每次登录系统都会向该账户发出 "修改密码" 的警告信息。
密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。
比如说,此字段规定的宽限天数是 10
,则代表密码过期 10
天后失效;如果是 0
,则代表密码过期后立即失效;如果是 -1
,则代表密码永远不会失效。
账号失效时间
同第 3
个字段一样,使用自 1970 年 1 月 1 日
以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!
该字段通常被使用在具有收费服务的系统中。
保留
这个字段目前没有使用,等待新功能的加入。
忘记密码怎么办
对于普通账户的密码遗失,可以通过 root
账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root
的身份使用 passwd
命令即可)。
如果 root
账号的密码遗失,则需要重新启动进入单用户模式,系统会提供 root
权限的 bash
接口,此时可以用 passwd
命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow
,将账户的 root
密码清空的方法,此方式可使用 root
无法密码即可登陆,建议登陆后使用 passwd
命令配置 root
密码。
单用户模式
如果忘记了root
账户密码导致无法登陆系统时,直接选择重新系统是大可不必,只需要进入emergency mode
(单用户模式)更新root
账户的密码即可。
Linux
单用户模式类似于Windows
的安全模式,只启动最少的程序用于系统恢复,在单用户模式(运行级别为1)中,Linux
引导进入根shell
,网络被禁用,只有少数进程运行。
单用户模式可以用来修改文件系统损坏、还原配置文件、移动用户数据等。
-
如何进入单用户模式
首先需要重启服务器,在 GRUB
读秒界面按任意键,进入 GRUB
菜单界面。

在想要进入单用户模式的 Linux
菜单上按"e"
键,就会进入 GRUB
编辑界面.

在 GRUB
编辑界面中,移动光标到第二行 kernel
行,然后继续按"e"
键,进入行编辑界面。在此行最后输入"空格 single
",代表启动进入单用户模式(注意:空格必须存在)

然后按回车键,就会回到上一个界面,如图 2 所示。再按"b"
键(启动),就会启动进入单用户模式。单用户模式是不需要输入用户名和密码就能直接进入提示符界面的,如图 4 所示。

我们已经登录了 Linux
系统的单用户模式,而且是不需要输入用户名和密码就可以直接进入的。这时如果有系统问题,就可以在单用户模式中进行修复了。
-
如何修改遗忘的 root
密码
进入单用户模式后,可以直接给root
用户设定新密码。
passwd root

-
如何修改系统默认运行级别
如果我们把系统的默认运行级别修改错误,比如改为了 0
或 6
,系统就不能正常启动了。这时也可以利用单用户模式进行修复,**只需直接修改默认运行级别配置文件 /etc/inittab
**,把系统默认运行级别修改回来即可。命令如下
[root@localhost /]# vi /etc/inittab
id:3:initdefault:
#把默认运行级别修改为3或5。注意:系统的默认运行级别只能使用3或5
/etc/group
文件
/ect/group
文件是用户组配置文件,即用户组的所有信息都存放在此文件中.
此文件是记录组 ID(GID)
和组名相对应的文件。前面讲过,etc/passwd
文件中每行用户信息的第四个字段记录的是用户的初始组 ID
,那么,此 GID
的组名到底是什么呢?就要从 /etc/group
文件中查找。
[root@localhost ~]#vim /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
…省略部分输出…
lamp:x:502:
各用户组中,还是以 ":"
作为字段之间的分隔符,分为 4
个字段,每个字段对应的含义为:
组名:密码:GID:该用户组中的用户列表
组名
也就是是用户组的名称,有字母或数字构成。同 /etc/passwd
中的用户名一样,组名也不能重复。
组密码
和 /etc/passwd
文件一样,这里的 "x"
仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow
文件中。
不过,用户设置密码是为了验证用户的身份,那用户组设置密码是用来做什么的呢?用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo
命令代替。
组ID
(GID)
Linux
系统就是通过 GID
来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。 这里的组 GID
与 /etc/passwd
文件中第 4
个字段的 GID
相对应,实际上,/etc/passwd
文件中使用 GID
对应的群组名,就是通过此文件对应得到的。
组中的用户
此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。
lamp
组的组信息为 "lamp:x:502:"
,可以看到,第四个字段没有写入 lamp
用户,因为 lamp
组是 lamp
用户的初始组。如果要查询这些用户的初始组,则需要先到 /etc/passwd
文件中查看 GID
(第四个字段),然后到 /etc/group
文件中比对组名。
每个用户都可以加入多个附加组,但是只能属于一个初始组。 所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加. 我们想让 lamp
也加入 root
这个群组,那么只需要在第一行的最后一个字段加入 lamp
,即 root:x:0:lamp
就可以了
用户的初始组就是在建立用户的同时建立的和用户名相同的组。
学习了/etc/passwd
、/etc/shadow
、/etc/group
,它们之间的关系可以这样理解,即先在 /etc/group
文件中查询用户组的 GID 和组名;然后在 /etc/passwd
文件中查找该 GID
是哪个用户的初始组,同时提取这个用户的用户名和 UID
;最后通过 UID
到 /etc/shadow
文件中提取和这个用户相匹配的密码。
/etc/gshadow
文件
/etc/passwd
文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放另一个文件 /etc/shadow
中。组用户信息存储在 /etc/group
文件中,而将组用户的密码信息存储在 /etc/gshadow
文件中.
[root@localhost ~]#vim /etc/gshadow
root:::
bin:::bin, daemon
daemon:::bin, daemon
...省略部分输出...
lamp:!::
组名:加密密码:组管理员:组附加用户列表
组名
同 /etc/group
文件中的组名相对应。
组密码
对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 "!"
,指的是该群组没有组密码,也不设有群组管理员。
组管理员
从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?
考虑到 Linux
系统中账号太多,而超级管理员 root
可能比较忙碌,因此当有用户想要加入某群组时,root
或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root
了.
组中的附加用户
该字段显示这个用户组中有哪些附加用户,和 /etc/group
文件中附加组显示内容相同。
Linux
初始组和附加组
群组可以让多个用户具有相同的权限,同时也可以这样理解,一个用户可以所属多个群组,并同时拥有这些群组的权限,这就引出了初始组(有时也称主组)和附加组。
/etc/passwd
文件中每个用户信息分为 7
个字段,其中第 4
字段(GID)
指的就是每个用户所属的初始组,也就是说,当用户一登陆系统,立刻就会拥有这个群组的相关权限。
我们新建一个用户 lamp
,并将其加入 users
群组中,执行命令如下:
[root@localhost ~]# useradd lamp <--添加新用户
[root@localhost ~]# groupadd users <--添加新群组
[root@localhost ~]# usermod -G users lamp <--将用户lamp加入 users群组
[root@localhost ~]# grep "lamp" /etc/passwd /etc/group /etc/gshadow
/etc/passwd:lamp:x:501:501::/home/lamp:/bin/bash
/etc/group:users:x:100:lamp
/etc/group:lamp:x:501:
/etc/gshadow:users:::lamp
/etc/gshadow:lamp:!::
在 etc/passwd
文件中,lamp
用户所属的 GID
(群组 ID
)为 501
,通过搜索 /etc/group
文件得知,对应此 GID
的是 lamp
群组,也就是说,lamp
群组是 lamp
用户的初始组。
lamp
群组是添加 lamp
用户时默认创建的群组,在 root
管理员使用 useradd
命令创建新用户时,若未明确指定该命令所属的初始组,useradd
命令会默认创建一个同用户名相同的群组,作为该用户的初始组。
在这个例子中,因为 lamp
用户同时属于 lamp
和users
两个群组,所在,在读取\写入\运行文件时,只要是 user
和 lamp
群组拥有的功能,lamp
用户都拥有。
一个用户可以所属多个附加组,但只能有一个初始组。可以使用groups
命令查看
我们现在以 lamp
用户的身份登录系统,通过执行如下命令即可知晓当前用户所属的全部群组:
[root@localhost ~]# groups
lamp users
通过以上输出信息可以得知,lamp
用户同时属于 lamp
群组和 users
群组,而且,第一个出现的为用户的初始组,后面的都是附加组.
/etc/login.defs
创建用户的默认设置文件
/etc/login.defs
文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID
和 GID
的范围,用户的过期时间,密码的最大长度,等等
需要注意的是,该文件的用户默认配置对 root
用户无效。并且,当此文件中的配置与 /etc/passwd
和 /etc/shadow
文件中的用户信息有冲突时,系统会以/etc/passwd
和 /etc/shadow
为准。

useradd
命令创建系统用户
useradd
命令基本格式:
useradd [选项] 用户名

useradd lamp
-->创建了lamp
普通用户。
它会完成以下操作:
-
在 /etc/passwd
文件中创建一行与lamp
用户相关的数据:
[root@localhost ~]# grep "lamp" /etc/passwd
lamp:x:500:500::/home/lamp:/bin/bash
-
在 /etc/shadow
文件中新增了一行与lamp
用户密码相关的数据:
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!!:15710:0:99999:7:::
当然,这个用户还没有设置密码,所以密码字段是 "!!"
,代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段,例如密码有效期有 99999
天,距离密码过期 7
天系统会提示用户“密码即将过期”等。
-
在 /etc/group
文件中创建一行与用户名一模一样的群组:
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:500:
-
在 /etc/gshadow
文件中新增一行与新增群组相关的密码信息:
[root@localhost ~]# grep "lamp" /etc/gshadow
lamp:!:: //当然,我们没有设定组密码,所以这里没有密码,也没有组管理员。
-
默认创建用户的主目录和邮箱:
[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
-
将 /etc/skel
目录中的配置文件复制到新用户的主目录中
除了默认创建用户,我们还可以利用 useradd
命令的各种选项亲自定制要创建的用户,例如:
[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:lampl:x:502:
#GID为502的组是lamp1组
[root@localhost ~]#ll -d /home/lamp1/
drwx------ 3 lamp1 lamp1 4096 1月6 01:13 /home/lamp1/
#家目录也建立了,不需要手工建立
useradd
命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd
和 /etc/login.defs
.
/etc/default/useradd
文件
可以使用vim
查看/etc/default/useradd
文件的内容,或者也可以使用useradd -D
查看新建用户的默认值。
[root@localhost ~]#vim /etc/default/useradd
# useradd defaults file
GR0UP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

此文件中各选项值的修改方式有 2
种,一种是通过 Vim
文本编辑器手动修改,另一种就是使用文章开头介绍的 useradd
命令.

[root@localhost ~]# useradd -D -s /bin/csh
[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
useradd
命令创建用户的过程是这样的,系统首先读取 /etc/login.defs
和 /etc/default/useradd
,根据这两个配置文件中定义的规则添加用户,也就是向 /etc/passwd
、/etc/group
、/etc/shadow
、/etc/gshadow
文件中添加用户数据,接着系统会自动在 /etc/default/useradd
文件设定的目录下建立用户主目录,最后复制 /etc/skel
目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了。
passwd
命令修改用户密码
学习 useradd
命令我们知道,使用此命令创建新用户时,并没有设定用户密码,因此还无法用来登陆系统.
passwd
命令的基本格式:
[root@localhost ~]#passwd [选项] 用户名
-
-S
:查询用户密码的状态,也就是/etc/shadow
文件中此用户密码的内容。仅root
用户可用 -
-l
: 该选项会在/etc/shadow
文件中指定用户的加密密码串前添加"!"
,使密码失效。仅root
用户可用 -
-u
:解锁用户,和-l
选项相对应,也是只能root
用户使用; -
-n
天数:设置该用户修改密码后,多长时间不能再次修改密码,也就是修改/etc/shadow
文件中各行密码的第4
个字段 -
-x
天数:设置该用户的密码有效期,对应/etc/shadow
文件中各行密码的第5
个字段; -
-w
天数:设置用户密码过期前的警告天数,对于/etc/shadow
文件中各行密码的第6
个字段; -
-i
日期:设置用户密码失效日期,对应/etc/shadow
文件中各行密码的第7
个字段。 -
--stdin
:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用 -
使用
root
账户修改lamp
普通用户的密码
[root@localhost ~]#passwd lamp
Changing password for user lamp.
New password: <==直接输入新的口令,但屏幕不会有任何反应
BAD PASSWORD: it is WAY too short <==口令太简单或过短的错误!这里只是警告信息,输入的密码依旧能用
Retype new password: <==再次验证输入的密码,再输入一次即可
passwd: all authentication tokens updated successfully. <==提示修改密码成功
当然,也可以使用 passwd
命令修改当前系统已登录用户的密码,但要注意的是,**需省略掉 "选项" 和 "用户名"**。例如,我们登陆 lamp
用户,并使用 passwd
命令修改 lamp
的登陆密码,执行过程如下:
[root@localhost ~]#passwd
#passwd直接回车代表修改当前用户的密码
Changing password for user vbird2.
Changing password for vbird2
(current) UNIX password: <==这里输入『原有的旧口令』
New password: <==这里输入新口令
BAD PASSWORD: it is WAY too short <==口令检验不通过,请再想个新口令
New password: <==这里再想个来输入吧
Retype new password: <==通过口令验证!所以重复这个口令的输入
passwd: all authentication tokens updated successfully. <==成功修改用户密码
与使用 root
账户修改普通用户的密码不同,普通用户修改自己的密码需要先输入自己的旧密码,只有旧密码输入正确才能输入新密码。不仅如此,此种修改方式对密码的复杂度有严格的要求,新密码太短、太简单,都会被系统检测出来并禁止用户使用。
而使用 root
用户,无论是修改普通用户的密码,还是修改自己的密码,都可以不遵守 PAM
模块设定的规则,就比如我刚刚给 lamp
用户设定的密码是 "123"
,系统虽然会提示密码过短和过于简单,但依然可以设置成功.
#查看用户密码的状态
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1 (Password set, SHA512 crypt.)
#上面这行代码的意思依次是:用户名 密码 设定时间(2013*01-06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1),密码已使用
#修改 lamp的密码,使其具有 60 天变更、10 天密码失效
[root@localhost ~]# passwd -x 60 -i 10 lamp
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 60 7 10 (Password set, SHA512 crypt.)
但我个人认为,还是直接修改 /etc/shadow 文件简单一些。
#锁定 lamp 用户
[root@localhost ~]# passwd -I lamp
Locking password for user lamp.
passwd:Successg
#用"-S"选项査看状态,很清楚地提示密码已被锁定
[root@localhost ~]# passwd -S lamp
lamp LK 2013-01-06 0 99999 7 -1 (Password locked.)
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!! $6$ZTq7o/9o $lj07iZ0bzW.D1zBa9CsY43d04onskUCzjwiFMNt8PX4GXJoHX9zA1S C9.i Yzh9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7:::
#可以看到,锁定其实就是在加密密码之前加入了"!!",让密码失效而已
暂时锁定 lamp
用户后,此用户就不能登录系统了。那么,怎么解锁呢?也一样简单,使用如下命令即可:
#解锁 lamp 用户
[root@localhost ~]# passwd -u lamp
Unlocking password for user lamp.
passwd:Success
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1 (Password set, SHA512 crypt.)
#可以看到,锁定状态消失
[root@localhost ~]# grep "lamp" /etc/shadow
lamp: $6$ZTq7cV9o $lj07iZ0bzW.D1zBa9CsY43d04onskUCzjwiFMNt8PX4GXJoHX9zA1S C9.iYz h9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7:::
#密码前面的 "!!" 删除了
#调用管道符,给 lamp 用户设置密码 "123"
[root@localhost ~]# echo "123" | passwd --stdin lamp
Changing password for user lamp.
passwd: all authentication tokens updated successfully.
使用此方式批量给用户设置初始密码,当然好处就是方便快捷,但需要注意的是,这样设定的密码会把密码明文保存在历史命令中,如果系统被攻破,别人可以在
/root/.bash_history
中找到设置密码的这个命令,存在安全隐患
如果使用这种方式修改密码,那么应该记住两件事情:第一,手工清除历史命令;第二,强制这些新添加的用户在第一次登录时必须修改密码
usermod
命令:修改用户信息
针对已有的用户可以使用usermod
命令进行修改。
一种方法使用 Vim
文本编辑器手动修改涉及用户信息的相关文件(/etc/passwd
、/etc/shadow
、/etc/group
、/etc/gshadow
),另一个方法就是使用 usermod
命令,该命令专门用于修改用户信息.
命令的基本格式:
usermod [选项] 用户名
-
-c
用户说明:修改用户的说明信息,即修改/etc/passwd
文件目标用户信息的第5
个字段; -
-d
主目录:修改用户的主目录,即修改/etc/passwd
文件中目标用户信息的第6
个字段,需要注意的是,主目录必须写绝对路径; -
-e
日期:修改用户的失效曰期,格式为"YYYY-MM-DD"
,即修改/etc/shadow
文件目标用户密码信息的第8
个字段; -
-g
组名:修改用户的初始组,即修改/etc/passwd
文件目标用户信息的第4
个字段(GID
) -
-u
UID
:修改用户的UID
,即修改/etc/passwd
文件目标用户信息的第3
个字段(UID
); -
-G
组名:修改用户的附加组,其实就是把用户加入其他用户组,即修改/etc/group
文件; -
-l
用户名: 修改用户名称 -
-L
临时锁定用户 -
-U
: 解锁用户(Unlock
),和-L
对应 -
-s shell
: 修改用户的登录Shell
,默认是/bin/bash
相比 useradd
命令,usermod
命令还多出了几个选项,即 -L
和 -U
,作用分别与 passwd
命令的 -l
和-u
相同。
此命令对用户的临时锁定,同
passwd
命令一样,都是在/etc/passwd
文件目标用户的加密密码字段前添加"!"
,使密码失效;反之,解锁用户就是将添加的"!"
去掉。
#锁定用户
[root@localhost ~]# usermod -L lamp
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!$6$YrPj8g0w$ChRVASybEncU24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKVQSky xlaMGs/Eg5AQwO.UokOnKqaHFa/:15711:0:999
#其实锁定就是在密码字段前加入"!",这时lamp用户就暂时不能登录了
#解锁用户
[root@localhost ~]# usermod -U lamp
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:$6$YrPj8g0w$ChRVASybEncU24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKVQSkyx laMGs/Eg5AQwO.UokOnKqaHFa/:15711:0:99999:7:::
#取消了密码字段前的 "!"
#把lamp用户加入root组
[root@localhost ~]# usermod -G root lamp
[root@localhost ~]# grep "lamp" /etc/group
root:x:0:lamp
#lamp用户已经加入了root组
lamp:x:501:
#修改用户说明
[root@localhost ~]# usermod -c "test user" lamp
[root@localhost ~]# grep "lamp" /etc/passwd
lamp:x:501:501:test user:/home/lamp:/bin/bash
#查看一下,用户说明已经被修改了
change
命令修改用户密码状态
除了 passwd -S
命令可以查看用户的密码信息外,还可以利用 chage
命令,它可以显示更加详细的用户密码信息,并且和 passwd
命令一样,提供了修改用户密码信息的功能。
change
命令的基本格式:
[root@localhost ~]#chage [选项] 用户名
-
l
: 列出用户详细密码状态 -
-d
日期:修改/etc/shadow
文件中指定用户密码信息的第3
个字段,也就是最后一次修改密码的日期,格式为YYYY-MM-DD
-
-m 天数
: 修改密码最短保留的天数,也就是/etc/shadow
文件中的第4
个字段 -
-M
天数: 修改密码的有效期,也就是/etc/shadow
文件中的第5
个字段 -
-W
天数: 修改密码到期前的警告天数,也就是/etc/shadow
文件中的第6
个字段 -
-i
天数: 修改密码过期后的宽限天数,也就是/etc/shadow
文件中的第7
个字段 -
-E
日期: 修改账号失效日期,格式为YYYY-MM-DD
,也就是/etc/shadow
文件中的第8
个字段。
#查看一下用户密码状态
[root@localhost ~]# chage -l lamp
Last password change:Jan 06, 2013
Password expires:never
Password inactive :never
Account expires :never
Minimum number of days between password change :0
Maximum number of days between password change :99999
Number of days of warning before password expires :7
chage
命令除了修改密码信息的功能外,还可以强制用户在第一次登录后,必须先修改密码,并利用新密码重新登陆系统,此用户才能正常使用
#创建新用户 lamp
[root@localhost ~]#useradd lamp
#设置用户初始密码为 lamp
[root@localhost ~]#echo "lamp" | passwd --stdin lamp
#**通过chage命令设置此账号密码创建的日期为 1970 年 1 月 1 日(0 就表示这一天),这样用户登陆后就必须修改密码**
[root@localhost ~]#chage -d 0 lamp
这样修改完 lamp
用户后,我们尝试用 lamp
用户登陆系统(初始密码也是 lamp
).
local host login:lamp
Password: <--输入密码登陆
You are required to change your password immediately (root enforced)
changing password for lamp. <--有一些提示,就是说明 root 强制你登录后修改密码
(current)UNIX password:
#输入旧密码
New password:
Retype new password:
#输入两次新密码
userdel
删除用户
userdel
命令功能很简单,就是删除用户的相关数据。此命令只有 root
用户才能使用。
用户的相关数据包含如下几项:
-
用户基本信息:存储在 /etc/passwd
文件中 -
用户密码信息:存储在 /etc/shadow
文件中 -
用户群组基本信息:存储在 /etc/group
文件中 -
用户群组密码信息:存储在 /etc/gshadow
文件中 -
用户个人文件:主目录默认位于 /home/用户名
,邮箱位于/var/spool/mail/用户名
userdel
命令的作用就是从以上文件中,删除与指定用户有关的数据信息.
基本格式如下:
userdel -r 用户名
-r
选项表示在删除用户的同时删除用户的家目录。注意,在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件
手动删除用户
#建立新 lamp 用户
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#为 lamp 用户设置密码,由此 lamp 用户才算是创建成功
#下面开始手动删除 lamp
[root@localhost ~]# vi /etc/passwd
lamp:x:501:501::/home/lamp:/bin/bash <--删除此行
#修改用户信息文件,删除lamp用户行
[root@localhost ~]#vi /etc/shadow
lamp:$6$KoOYtcOJ $56Xk9vp3D2vMRBxibNOn.21cVJ9onbW8IHx4WrOx6qBqfGa9U3mjMsGjqYnj 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/spod/mail/lamp #删除用户邮箱
[root@localhost ~]# rm -rf/home/lamp/ #删除用户的家目录
#至此,用户彻底删除,再新建用户lamp。如果可以正常建立,则说明我们手工删除干净了
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立同名用户,没有报错,说明前面的手工删除是可以完全删除用户的
id
命令查看用户的UID
和GID
id
命令可以查询用户的UID
、GID
和附加组的信息
id 用户名
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp)
#能看到uid(用户ID)、gid(初始组ID), groups是用户所在组,这里既可以看到初始组,如果有附加组,则也能看到附加组
[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
命令:用户间切换
su
是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户
切换为 root
用户、从 root
用户切换为普通用户
以及普通用户之间
的切换.
普通用户之间切换以及普通用户切换至
root
用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换;从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功。
su [选项]用户名
-
: 当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 -
选项可省略用户名,默认会切换为 root
用户
-l
:同 -
的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。
-p
:表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。
-m
: 和-p
一样
-c
:仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。
[lamp@localhost ~]$ su -root
密码: <-- 输入 root 用户的密码
#"-"代表连带环境变量一起切换,不能省略
[lamp@localhost ~]$ whoami
lamp
#当前我是lamp
[lamp@localhost ~]$ su - -c "useradd user1" root
密码:
#不切换成root,但是执行useradd命令添加user1用户
[lamp@localhost ~]$ whoami
lamp
#我还是lamp
[lamp@localhost ~]$ grep "user1' /etc/passwd
userl:x:502:504::/home/user1:/bin/bash
#user用户已经添加了
执行一条命令su -c "useradd user1" root
后用户身份会随即自动切换回来,其他切换用户的方式不会自动切换,只能使用 exit
命令进行手动切换
[lamp@localhost ~]$ whoami
lamp
#当前我是lamp
[lamp@localhost ~]$ su - lamp1
Password: <--输入lamp1用户的密码
#切换至 lamp1 用户的工作环境
[lamp@localhost ~]$ whoami
lamp1
#什么也不做,立即退出切换环境
[lamp1@localhost ~]$ exit
logout
[lamp@localhost ~]$ whoami
lamp
su
和su-
的区别
使用 su
命令时,有 -
和没有 -
是完全不同的,**-
选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行**。
普通用户 lamp
通过 su
命令切换成 root
用户,但没有使用 -
选项,这样情况下,虽然看似是 root
用户,但系统中的 $PATH
环境变量依然是 lamp
的(而不是 root
的),因此当前工作环境中,并不包含 /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/sbin:/sbin:/home/lamp/bin**
#命令査找的路径不包含超级用户路径
MAIL=/var/spool/mail/lamp
PWD=/home/lamp
LOGNAME=lamp
#邮箱、主目录、目前用户名还是lamp
whoami
和who am i
的区别
whoami
命令和 who am i
命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名
首先使用用户名为“Cyuyan”
登陆 Linux
系统,然后执行如下命令:
[Cyuyan@localhost ~]$ whoami
Cyuyan
[Cyuyan@localhost ~]$ who am i
Cyuyan pts/0 2017-10-09 15:30 (:0.0)
使用 su
命令切换到 root
用户下,再执行一遍上面的命令:
[Cyuyan@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Cyuyan pts/0 2017-10-09 15:30 (:0.0)
未切换用户身份之前,whoami
和 who am i
命令的输出是一样的,但使用 su
命令切换用户身份后,使用 whoami
命令打印的是切换后的用户名,而 who am i
命令打印的仍旧是登陆系统时所用的用户名。
使用 su
或者 sudo
命令切换用户身份,骗得过 whoami
,但骗不过 who am i
。要解释这背后的运行机制,需要搞清楚什么是实际用户(UID
)和有效用户(EUID
,即 Effective UID
)
所谓实际用户,指的是登陆 Linux
系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su
或者 sudo
命令进行任意切换的。
groupadd
添加用户组
命令格式: groupadd [选项] 组名
-
-g GID
: 指定组ID
-
-r
:创建系统群组。
[root@localhost ~]# groupadd group1
#添加group1组
[root@localhost ~]# grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:502:
/etc/gshadow:group1:!::
groupmod
命令修改用户组
groupmod
命令用于修改用户组的相关信息,命令格式如下: 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
命令删除用户组
groupdel
命令用于删除用户组(群组),此命令基本格式为
groupdel 组名
使用 groupdel
命令删除群组,其实就是删除 /etc/gourp
文件和 /etc/gshadow
文件中有关目标群组的数据信息.
不能使用 groupdel
命令随意删除群组。此命令仅适用于删除那些 "不是任何用户初始组" 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel
命令成功删除
[root@localhost ~]# useradd temp
#运行如下命令,可以看到 temp 用户建立的同时,还创建了 temp 群组,且将其作为 temp用户的初始组(组ID都是 505)
[root@localhost ~]# grep "temp" /etc/passwd /etc/group /etc/gshadow
/etc/passwd:temp:x:505:505::/home/temp:/bin/bash
/etc/group:temp:x:505:
/etc/gshadow:temp:!::
#下面尝试删除 temp 群组
[root@localhost ~]# groupdel temp
groupdel:cannot remove the primary group of user 'temp'
groupdel
命令删除 temp
群组失败,且提示“不能删除 temp
用户的初始组”。如果一定要删除 temp
群组,要么修改 temp
用户的 GID
,也就是将其初始组改为其他群组,要么先删除 temp
用户。
gpasswd
命令设置群组管理员
为了避免系统管理员(root
)太忙碌,无法及时管理群组,我们可以使用 gpasswd
命令给群组设置一个群组管理员,代替 root
完成将用户加入或移出群组的操作。
gpasswd 选项 组名

除 root
可以管理群组外,可设置多个普通用户作为群组的管理员,但也只能做“将用户加入群组”和“将用户移出群组”的操作
#创建新群组 group1,并将群组交给 lamp 管理
[root@localhost ~]# groupadd group1 <-- 创建群组
[root@localhost ~]# gpasswd group1 <-- 设置密码吧!
Changing the password for group group1
New Password:
Re-enter new password:
[root@localhost ~]# gpasswd -A lamp group1 <==加入群组管理员为 lamp
[root@localhost ~]# grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:506:
/etc/gshadow:group1:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:lamp:
#以lamp用户登陆系统,并将用户 lamp 和 lamp1 加入group1群组。
[lamp@localhost ~]#gpasswd -a lamp group1
[lamp@localhost ~]#gpasswd -a lamp1 group1
[lamp@localhost ~]#grep "group1" /etc/group
group1:x:506:lamp,lamp1
使用
usermod -G
命令也可以将用户加入群组,但会产生一个问题,即使用此命令将用户加入到新的群组后,该用户之前加入的那些群组都将被清空.因此,将用户加入或移出群组,最好使用gpasswd
命令。
#新创建一个群组group2
[root@localhost ~]# groupadd group2
[root@localhost ~]# usermod -G group2 lamp
[root@localhost ~]# grep "group2" /etc/group
group2:x:509:lamp
[root@localhost ~]# grep "group1" /etc/group
group1:x:506:lamp1
虽然使用 usermod
命令成功地将 lamp
用户加入在 group2
群组中,但 lamp
用户原本在 group1
群组中,此时却被移出,这就是使用 usermod
命令造成的。
newgrp
命令
每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,所创建文件默认生效的组身份是初始用户组。使用命令newgrp
命令可以改变用户的初始组。
newgrp
命令可以从用户的附加组中选择一个群组,作为用户新的初始组
newgp 组名
-
首先,建立 3 个用户组 group1
、group2
和group3
,命令如下
[root@localhost ~]# groupadd group1
[root@localhost ~]# groupadd group2
[root@localhost ~]# groupadd group3
-
创建一个用户 user1
,同时指定user1
的初始组为group1
,附加组为group2
和group3
,执行命令如下:
[root@localhost ~]# useradd -g group1 -G group2,group3 user1
#由于指定了初始组,因此不会在创建 user1 默认群组
[root@localhost ~]# more /etc/group | grep user1
group2:x:501:user1
group3:x:502:user1
-
对用户 user1
设置密码,执行命令如下
[root@localhost ~]# passwd user1
Changing password for user user1.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
-
切换至 user1
用户,通过newgrp
切换用户组进行下列操作:
#切换至 user1 用户
[root@localhost ~]# su - user1
[root@localhost ~]# whoami
user1
#使用 newgrp 命令一边切换 user1 的初始组,一边创建文件
[root@localhost ~]# mkdir user1_doc
[root@localhost ~]# newgrp group2
[root@localhost ~]# mkdir user2_doc
[root@localhost ~]# newgrp group3
[root@localhost ~]# mkdir user3_doc
#查看各文件的详细信息
[root@localhost ~]# ll
total 12
drwxr-xr-x 2 user1 group1 4096 Oct 24 01:18 user1_doc
drwxr-xr-x 2 user1 group2 4096 Oct 24 01:18 user2_doc
drwxr-xr-x 2 user1 group3 4096 Oct 24 01:19 user3_doc
通过使用 newgrp
命令切换用户的初始组,所创建的文件各自属于不同的群组,这就是 newgrp
所发挥的作用,即通过切换附加组成为新的初始组,从而让用户获得使用各个附加组的权限。
作者介绍