# Linux 用户与用户组

# UID 和 GID

在 Linux 系统中,每个用户都有两种 ID, 一种是 UID (User ID), 另一种是 GID (Group ID)

# UID

# passwd

每个人都有唯一的一个 UID, Linux 就是通过 UID 区分不同用户,而用户名与 UID 的对应关系,则存在 /etc/passwd 文件中

1
grep 'wong' /etc/passwd
image-20220313233441971
grep查找显示到一条结果
  • wong , 也就是第一个字符串,代表的是用户名

  • x , 代表该用户设置了密码 (密码保存在 /etc/shadow )

    如果用户未设置密码,则该字段显示 !! 或是 * , 表示没有密码,不能登录

    有一些软件透过这个功能实现密码暂时无效

  • 1000 , 表示用户的 UID 为 1000

    UID 范围用户身份
    0超级用户,UID 为 0 就代表这个账号是管理员账号
    1~499系统用户 (伪用户), 也就是说,此范围的 UID 保留给系统使用。其中 1~99 用于系统自行创建的账号,100~499 分配给由系统账号需求的用户
    500~65535普通用户,通常这些 UID 已经足够用户使用了,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了
  • 1000 , 第二个 1000 表示用户的初始组

    默认 (新增用户时不单独配置参数的话) 将和此用户的用户名相同的组名作为该用户的初始组

  • realwong,,, , 表示描述性信息

  • /home/wong/ , 表示宿主目录

  • /bin/bash , 表示默认 shell

    可以把这个字段理解为用户登录后所拥有的权限,如果这里使用的是 bash 命令解释器,那么就代表这个用户拥有权限范围内的所有权限

    如果命令解释器修改为 /sbin/nologin , 那么这个用户就不能登录了 (适用于 FTP 等需要用户但是不希望用户可以登录 Linux 系统的功能)

最后再来看一下 /etc/passwd 文件中的内容

image-20220314000228026

# shadow

由于 /etc/passwd 对所有用户可读,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了 shadow 文件中

为何 passwd 对所有用户可读

按照惯例通过 grep 寻找一下 wong 用户的信息

1
2
3
4
grep 'wong' /etc/shadow
# grep: /etc/shadow: Permission denied
sudo grep 'wong' /etc/shadow
wong:$1$2CGkNsh/$RJUvvShF8.Lc21gl1VJhv0:19063:0:99999:7:::
image-20220314001255771
可以看出`shadow`文件的访问权限很高, 只有root用户才能查看
  • wong , 表示用户名

  • $1………….. , 为 SHA512 加密后的密码,如果在这之前加上 !!* , 则使密码无效 (CTRL + 点击查看相关点)

  • 19063 , 表示最后一次修改密码时间,这里的时间表示的是从 1970 年 1 月 1 日至今的天数

    如果要想知道 19063 对应的是现在的那一天,可以使用如下命令

    1
    2
    date -d '1970-01-01 19063 days'
    # Sat 12 Mar 2022 12:00:00 AM PST
  • 0 , 表示最小修改时间间隔,也就是说,自从上一次修改密码开始算起,至少要经过多少天才能再次修改密码,0 表示随时都可以修改

  • 99999 , 表示密码有效期,为了强制要求用户变更密码,这个字段可以指定,自上次修改密码开始算起,多长时间内必须再次修改面膜,否则该账户密码进行过期阶段

  • 7 , 表示密码需要变更前的警告天数,当账户密码快到期时,系统会发出警告信息给此账户,提醒用户再次修改面膜

  • , 截图中为空,但此字段表示密码过期后的宽限天数,在此字段规定的宽限天数内,用户还是可以登陆系统的,如果过了宽限天数,系统将不再让此账户登录,也不会提示账户过期,是完全禁用

  • , 截图中仍然为空,但此字段表示账号失效时间,也是从 1970 年 1 月 1 日记起,一旦到达账号失效日期,无论密码是否失效,都将无法使用

  • , 保留字段,等待新功能的加入

再来看一下 /etc/shadow 文件中的内容

image-20220314003728832

忘记 root 密码该怎么办

# GID

# group

前文说到, 每个用户都有一个初始组,除此之外,每个用户还可以添加多个附属组,以实现更加灵活的权限管理

首先来看一下 /etc/group 文件中储存的关于用户 wong 的信息

1
grep 'wong' /etc/group
image-20220314144310285
  • 第一个字段 : adm , dip , wong , sudo 等,表示组名
  • x , 表示该组有密码
  • 4 , 1000 等,表示组 ID
  • wong , 表示组中的用户, 含多个用户,之间用逗号分隔

可以看到倒数第二排,组名为 wong , 组 ID 为 1000, 组中的用户并没有显示,实际上这就是用户 wong 的初始组

我们可以验证一下

1
2
3
grep 'wong' /etc/passwd		#在passwd文件中查看wong用户的初始组ID

#wong:x:1000:1000:realwong,,,:/home/wong:/bin/bash

可以看到, wong 用户所对应的组 ID 是 1000, 同时也说明,在用户的初始组那一行,被属于的那个用户是不会显示在 组中的用户 这个字段里的

最后我们再来看一下 /etc/group 文件中的内容

image-20220314145122934

可以看到, 用户`wong`加入了很多组, 也就是附属组

# gshadow

和 shadow 文件类似,gshadow 文件是用来存放组用户的密码信息的

来看一下有关用户 wong 的信息

1
grep 'wong' /etc/gshadow
image-20220314145505690
可以看到, 也是需要root用户才能访问
  • adm , sudo , wong , 表示组名,与 /etc/group 中的组名相对于

  • 组密码, * 表示该群组没有组密码,也不设有组管理员, 表示没有组密码

  • 组管理员,就类似于 QQ 群管理员,审核管理群组的

    不过,目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少用到了

  • 组中的附加用户,/etc/group 的最后一个字段相同