linux从入门到精通七:用户管理

视频与文档都来自尚硅谷,点此链接(http://www.atguigu.com/linux_video.shtml#linux_yw)

文章目录


前言

无论是Linux还是Windows添加用户和组都是很方便的。
但重点在于区分服务器和个人电脑。
对于个人电脑,超级用户和普通用户不需要特别区分。
但对于服务器,这上面有非常多的数据。而且使用者肯定不止有自己,不同级别的人必须有不同的权限,绝不能所有人都是管理员用户(超级用户),必须有专门的人来管相应的数据。所以一定要有合理的用户管理和权限分配,而且越重要的数据,越要权限分割

权限分割最主要的目的不是用来防范外部攻击,主要目的是为了防范内部风险。


一、用户相关文件

注意这些文件,不光要背下文件名、文件路径,文件内容也要搞明白。这些文件相当重要!!

1. /etc/passwd 用户信息文件

root:x:0:0:root:/root:/bin/bash
:为分隔符

第一列: 用户名。 对应上面的root

第二列: (标记)密码位,不是真正的密码。 对应上面的x,x仅仅代表这个用户有密码,如果有密码的话那么系统会去shadow文件里找,如果不写密码位,系统会默认没有密码,不回去shadow文件里找。shadow文件后面会讲

第三列: 用户 ID。 对应上面的0

  1. 0 超级用户 UID(User ID)。如果用户 UID 为 0,代表这个账号是管理员账号。那 Linux 中
    如何把普通用户升级成为管理员呢?就是把其他用户的 UID 修改为 0 就可以了,这点和
    Windows 是不同的。不过不建议建立多个管理员账号。
  2. 1-499 系统用户(伪用户)UID。这些 UID 账号是系统保留给系统用户的 UID,也就是
    说 **UID 是 1-499 范围内的用户是不能登录系统(也不能删!)**的,而是用来运行系统或服务的。其中1-99 是系统保留的账号,系统自动创建。100-499是预留给用户创建系统账号的。
    (对于网站上的各个用户:其实它们只是数据库里的一条条数据而已,映射到Linux中就Mysql这一个伪用户而已,不是说淘宝上有多少用户,Linux里就有多少个UID,其实就数据库这一个用户而已)
  3. 500-60000 普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 60000。这些用
    户足够使用了,但是如果不够也不用害怕,2.6.x 内核以后的 Linux 系统用户 UID 已经可以支持 2^32这么多了。

第四列:对应上面的0。
当组 ID GID 添加用户时,如果不指定用户所属的初始组,那么会建立和用户名相
同的组。Linux新建一个用户,同时就会新建一个组,默认与用户同名。

第五列: 用户说明。对应上面的root

第六列: 用户家目录 ~,对应上面的/root。注意第六列的家目录对伪用户不起作用

第七列: 登录 shell,可以理解为用户登录之后他有什么权限。如果写的是 /bin/bash,这是Linux下标准的shell,那么就证明这个用户可以执行自己权限内的所有权限。超级用户执行超级用户的,普通用户执行普通用户的权限。
伪用户写的是/sbin/nologin,如果把普通用户的权限也改为/sbin/nologin,那么以后这个用户就登陆不了了。

如何把普通用户变成超级用户:把用户 UID 改为 0。也就是说系统靠UID识别用户,跟他在那个组每多大关系。没有特殊情况不允许把普通用户改为root用户

在这里插入图片描述
NFS是个特例,记住就行。
在这里插入图片描述

理论上所有的服务都有自己的伪用户,rpm包和源码包的服务他们对应的伪用户还不一样

伪用户不能登录,也决不允许删!

所以可以用查伪用户的方式来区分源码包和rpm包下载的服务

在这里插入图片描述
在这里插入图片描述





2. /etc/shadow 影子文件

在这里插入图片描述





以root为例,共9列。
在这里插入图片描述
第一列: 用户名。对应上面的root
第二列: 加密密码。

  1. 我们也可以在密码前人为的加入“!”或“*”改变加密值让密码暂时失效,使这个用
    户无法登陆,达到暂时禁止用户登录的效果。

    在这里插入图片描述

在这里插入图片描述

  1. 注意所有伪用户的密码都是“!!”或“*”,代表没有密码是不能登录的。当然我新
    创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录

第三列: 密码最近更改时间, 1970 年 1 月 1 日作为标准时间。对应上面的19128
注意这里的19128不是真正的时间,它是一个时间戳。指的是在1970 年 1 月 1 日后又过了19128天

下面的知道有这件事就行。

时间戳转日期

[root@localhost1 ~]#  date -d "1970-01-01 19128 days"
2022年 05月 16日 星期一 00:00:00 CST

日期转时间戳

[root@localhost1 ~]#  echo $(($(date --date="2022/07/10" +%s)/86400+1))
19183
#date --date="2022/07/10" +%s它的作用是把指定的时间换算成秒

第四列: 两次密码的修改间隔时间(和第 3 字段相比),也就是说得隔几天才能改密码。对应上面的0.
这一列不建议改,比如改为5那么就代表我们得隔5(19128后再加5)天才能改密码。

第五例: 密码有效期(和第 3 字段相比),只是用来提示用户改密码的。对应上面的99999
在有效期内改一次密码。有效期都会重置为初始值。

第六列: 密码修改到期前的警告天数(和第 5 字段相比)对应上面的7
比如密码有效期是180天,那么从第173天开始每次登陆就会提示我们去修改密码。不建议有效期太长

第七列: 密码过期后的宽限天数(和第 5 字段相比)
啥都没写的话,默认值是-1,代表这个用户密码永不过期。也就是说就算到了180天,不修改密码也没关系。不建议使用默认值-1

第八列: 真正的密码失效时间
这里同样要写时间戳,也就是用 1970 年 1 月 1 日进行时间换算。如果超过了
失效时间,就算密码没有过期,用户也就失效无法使用了

第九列: 保留(最后那一个:号后面还有一列,没啥用)







3. /etc/group 组信息文件

在这里插入图片描述



以root为例
root:X:0:root

第一列: 组名
第二列: 组密码位,说明组也可以设密码。但不建议给组设密码,给组中添加用户还是应该由root来干,不建议给其他人来干
第三列: GID
第四列: 此组中支持的其他用户。也就是附加组是此组的用户,注意如果把一个用户的初始组放到这个组里,group文件里是看不到这个用户的,这个第四列只能看附加组是本组的用户
初始组:每个用户初始组只能而且必须有一个,一般都是和用户名相同的组作为初始组
附加组:每个用户可以属于多个附加组。要把用户加入组,都是加入附加组



4.组密码文件/etc/gshadow(知道有这回事就行)

如果我给用户组设定了组管理员,并给该用户组设定了组密码,组密码就保存在这个文件当中。
组管理员就可以利用这个密码管理这个用户组了。

5. 用户的家目录

家目录名跟用户名相同,在/home目录下。

6. 用户邮箱目录

这个邮箱在/var/spool/mail 目录当中,例如 user1 用户的邮箱就是/var/spool/mail/user1 文件

7.用户模板目录 /etc/skel/

它的机理是每次新建用户时都会把这个目录里的文件拷一份到新建用户的家目录下

注意:.viminfo .Xauthority是日后添加进去的(比如连接远程工具生成了.Xauthority),刚开始没有。
在这里插入图片描述
1.我们每新建一个用户,都会自动新建它的家目录,这个家目录里有一些隐藏文件。这些隐藏文件是系统根据模板来创建的。
2.而且/etc/skel下的模板是通用的,每次新建用户,都会根据这个模板来建家目录
在这里插入图片描述
在这里插入图片描述







二. 用户管理命令

1. 添加用户

1.1 手工删除用户了,这样子删除非常麻烦,了解就行

实际上就是让我们知道新加的用户是写在了下面6个文件中

手工删除用户试验:手工删除,如果可以正常建立用户,证明用户删除干净。

/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
/home/user1
/var/spool/mail/user1 邮箱

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述





1.2 useradd 命令,基本不用加选项

注意:添加完用户后,一定要设密码,否则可能无法登陆。(除非是伪用户)
root用户可以设简易密码,但普通用户必须得按照要求来设密码
useradd 选项 用户名
选项:
-u    550 指定 UID
/ / -u 选项一般不用
/ / 如果我指定了UID为550,现在系统默认的才到503。
/ / 那么下次再添加用户(不指定UID的情况下)系统默认的UID将从551开始
-g    组名 指定初始组 不要手工指定
/ /   -g选项不要用!不要手工指定初始组!
//   及其别扭,可能会搞得自己不知道初始组是啥
-G    组名 指定附加组,把用户加入组,使用附加组
/ /   -G选项用的是最多的
-c    说明 添加说明
-d    目录 手工指定家目录,目录不需要事先建立
/ /不建议指定家目录
-s shell /bin/bash.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

例如:
[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 的同时指定了 UID550),初始组(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:
#GID502 的组是 lamp1 组
[root@localhost ~]# ll -d /home/lamp1/
drwx------ 3 lamp1 lamp1 4096 16 01:13 /home/lamp1/
#家目录也建立了啊。不需要手工建立家目录




1.3 useradd 默认值

这部分了解,只要能看懂文件里的内容就行

useradd 添加用户时参考的默认值文件主要有两个 , 分别是 /etc/default/useradd 和
/etc/login.defs

1)/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

在这里插入图片描述

挨个解释下:

  1. GROUP=100
    这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。目前我们采用的机制私有用户组机制,也就是说我们目前每添加一个用户时没有把他们都放到GID为100的组里,前一个机制没有用。
  2. HOME=/home
    这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下。
  3. INACTIVE=-1
    这个选项就是密码过期后的宽限天数,也就是/etc/shadow 文件的第七个字段。如果是天数,比如 10 代表密码过期后 10 天后失效;如果是 0,代表密码过期后立即失效;如果是-1,则代表密码永远不会失效。这里默认值是-1,所以所有新建立的用户密码都不会失效。改了之后只会对新用户生效
  4. EXPIRE=
    这个选项是密码失效时间,也就是/etc/shadow 文件的第八个字段。也就说用户到达这个日期后就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,所以所有新建用户没有失效时间,永久有效。这个不常用,不要改,因为如果手工指定了一个时间,那么以后无论什么时间新建的用户,到这个时间都会失效。他不是顺延的那种
  5. SHELL=/bin/bash
    这个选项是用户的默认 shell 的。/bin/bash 是 Linux 的标志 shell,所以所有新建立的用户默认都具备 shell 赋予的权限。
  6. SKEL=/etc/skel
    这个选项就是定义用户的模板目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目录当中。
  7. CREATE_MAIL_SPOOL=yes
    这个选项定义是否给新建用户建立邮箱,默认是创建,也就是说所有的新建用户系统都会新建一个邮箱,放在/var/spool/mail/下和用户名相同。





2)/etc/login.defs,这里有大部分的shadow文件里的默认值

有需要的只要改个密码有效期PASS_MAX_DAYS就行,其他都用默认值。

[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

我们一行一行解释下文件内容:

  1. MAIL_DIR /var/spool/mail
    这行指定了新建用户的默认邮箱位置。比如 user1 用户的邮箱是就是/var/spool/mail/user1。
  2. PASS_MAX_DAYS 99999
    这行指定的是密码的有效期,也就是/etc/shadow 文件的第五字段。代表多少天之后必须修改密
    码,默认值是 99999。
  3. PASS_MIN_DAYS 0
    这行指定的是两次密码的修改间隔时间,也就是/etc/shadow 文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是 0。
  4. PASS_MIN_LEN 5这行代表密码的最小长度,默认不小于 5 位。但是我们现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
  5. PASS_WARN_AGE 7
    这行代表密码修改到期前的警告天数,也就是/etc/shadow 文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是 7 天。
  6. UID_MIN 500
  7. UID_MAX 60000
    这两行代表创建用户时,最小 UID 和最大的 UID 的范围。我们 2.6.x 内核开始,Linux 用户的 UID最大可以支持 2^32这么多,但是真正使用时最大范围是 60000。还要注意如果我手工指定了一个用户的
    UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500-549 之间的 UID 没有使用(小于 500 的 UID 是给伪用户预留的)。
  8. GID_MIN 500
  9. GID_MAX 60000
    这两行指定了 GID 的最小值和最大值之间的范围。
  10. CREATE_HOME yes
    这行指定建立用户时是否自动建立用户的家目录,默认是建立
  11. UMASK 077
    这行指定的是建立的用户家目录的默认权限,因为 umask 值是 077 (他没有采用系统的UMASK值),所以新建的用户家目录的权限是 700,umask 的具体作用和修改方法我们可以参考下一章权限设定章节。
  12. USERGROUPS_ENAB yes
    这行指定的是使用命令 userdel 删除用户时,是否删除用户的初始组,默认是删除。
  13. ENCRYPT_METHOD SHA512
    这行指定 Linux 用户的密码使用 SHA512 散列模式加密,这是新的密码加密模式,原先的 Linux只能用 DES 或 MD5 方式加密







2. 设定密码

[root@localhost ~]#passwd [选项] 用户名
选项:
-l: 暂时锁定用户。仅 root 用户可用
-u: 解锁用户。仅 root 用户可用
--stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
[root@localhost ~]#passwd
#passwd 直接回车代表修改当前用户的密码
/ / passwd +回车,只有这种方法可以改自己密码(当自己为普通用户时)
/ / 而且密码必须符合要求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

也可以使用字符串作为密码:

[root@localhost ~]# echo "123" | passwd --stdin user1 
更改用户 user1 的密码 。
/ / 这个主要用来批量添加用户
/ / 不过这种方式有缺陷
/ / 我们可以通过history查询历史命令的方式获取密码
/ / history -c 可以清空历史命令

在这里插入图片描述

可以通过命令,把密码修改日期归零(shadow 第 3 字段,注意不是改密码有效期).这样用户一登陆就要修改密码,例如:

[root@localhost ~]# chage -d 0 user1
/ / chage是用来修改密码属性的用的很少




3. 用户信息修改

usermod 命令是修改已经添加的用户的信息的,命令如下:

它的选项跟useradd的选项差不多

除了偶尔改一下附加组,其他都不建议改

[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)
[root@localhost ~]# usermod -l 新名 旧名
#改名
/ / 注意用这种方式改名的话,仅仅是改了个用户名。跟这个用户相关的各个文件里的名字都没改,及其痛苦

但是真不建议改名,这样及其容易把管理员自己搞晕菜,建议删除旧用户,再建立新用户!
在这里插入图片描述





4.删除用户,很重要

[root@localhost ~]# userdel [-r] 用户名
选项:-r: 在删除用户的同时删除用户的家目录
# -r是必备选项,必须要加!!!


5.切换用户身份,很重要

su 命令可以切换成不同的用户身份,命令格式如下:

[root@localhost ~]# su [选项] 用户名
选项:
-: 选项只使用“-”代表连带用户的环境变量一起切换
# 切换用户的时候 "-" 是必备选项!!
-c 命令:仅执行一次命令,而不切换用户身份
/ / -c选项不要用,而且注意c后面加的是一个命令不是用户名

“-”不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述









三. 组管理命令

1. 添加用户组:groupadd

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

[root@localhost ~]# groupadd [选项] 组名
选项:
-g GID: 指定组 ID
/ / 这个一般用不到

添加用户组的命令比较简单,举个例子:

[root@localhost ~]# groupadd group1
#添加 group1 组
[root@localhost ~]# grep "group1" /etc/group
group1:x:502:

2. 删除用户组:groupdel

groupdel 命令用于删除用户组,命令格式如下:

[root@localhost ~]#groupdel 组名
例子:
[root@localhost ~]#groupdel testgrp
#删除 testgrp 组

不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响(因为每个用户只能而且必须有一个初始组,所以不能删初始组)
在这里插入图片描述



3. 把用户添加进组或从组中删除:gpasswd

也可以用usermod,但建议用gpasswd,它添加的就是附加组,没有初始组的问题。而且还可以把用户从组中删除

也可以自己在group文件里添加,不用命令,但这样不适合做脚本。

其实 gpasswd 命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被 sudo 命令取代,所以 gpasswd 命令现在主要用于把用户添加进组或从组中删除。
命令格式如下:

[root@localhost ~]# gpasswd [选项] 组名
选项:
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除

举个例子:

[root@localhost ~]# groupadd grouptest
#添加组 grouptest
[root@localhost ~]# gpasswd -a user1 grouptest
Adding user user1 to group grouptest
#把用户 user1 加入 grouptest 组
[root@localhost ~]# grep "user1" /etc/group
user1:x:501:
grouptest:x:505:user1
#查看一下,user1 用户已经作为附加用户加入 grouptest 组
[root@localhost ~]# gpasswd -d user1 grouptest 
Removing user user1 from group grouptest
#把用户 user1 从组中删除
[root@localhost ~]# grep "grouptest" /etc/group
grouptest:x:505:
#组中没有 user1 用户了

大家注意,也可以使用 usermod 命令把用户加入某个组,不过 usermod 命令的操作对象是用户,命令是“usermod -G grouptest user1”,把用户名作为参数放在最后;而 gpasswd 命令的操作对象是组,命令是“gpasswd -a user1 grouptest”,把组名作为参数放在最后。
在这里插入图片描述

在这里插入图片描述





4.改变有效组:newgrp。用处不大,了解就行

这部分讲得就是我们新建一个文件时它默认的所属组是谁

我们说过,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?当然是初始用户组的组身份生效了,因为初始组是用户一旦登录就直接获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。
既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令 newgrp 就可以切换用户的有效组。
命令格式如下:

[root@localhost ~]# newgrp 组名

举个例子,我们已经有了普通用户 user1,默认会建立 user1 用户组,user1 组是 user1 用户的初始组。我们再把 user1 用户加入 group1 组,那么 group1 组就是 user1 用户的附加组。当 user1 用户创建文件 test1 时,test1 文件的属组是 user1 组,因为 user1 组是 user1 用户的有效组。通过 newgrp
命令就可以把 user1 用户的有效组变成 group1 组,当 user1 用户创建文件 test2 时,就会发现 test2文件的属组就是 group1 组。命令如下:

[root@localhost ~]# groupadd group1
#添加组 group1
[root@localhost ~]# gpasswd -a user1 group1
Adding user user1 to group group1
#把 user1 用户加入 group1 组
[root@localhost ~]# grep "user1" /etc/group
user1:x:501:
group1:x:503:user1
#user1 用户既属于 user1 组,也属于 group1 组
[root@localhost ~]# su – user1
#切换成 user1 身份,超级用户切换成普通用户不用密码
[user1@localhost ~]$ touch test1
#创建文件 test1
[user1@localhost ~]$ ll test1
-rw-rw-r-- 1 user1 user1 0 1 月 14 05:43 test1
#test1 文件的默认属组是 user1 组 [user1@localhost ~]$ newgrp group1
#切换 user1 用户的有效组为 group1 组 [user1@localhost ~]$ touch test2
#创建文件 test2
[user1@localhost ~]$ ll test2
-rw-r--r-- 1 user1 group1 0 1 月 14 05:44 test2
#test2 文件的默认属组是 group1 组

通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件时哪个组身份生效。使用 newgrp 命令可以在多个组身份之间切换。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但这样其实真没多大用,反而可能会把自己搞晕。
还不如建完文件后手工去改所有者所属组。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值