Linux用户和用户组
一、Linux用户和用户组的概念
- Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
- 不同用户具有不同的权限,毎个用户在权限允许的范围内完成不间的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。
- 用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有 10 个用户的话,就需要授权 10 次,那如果有 100、1000 甚至更多的用户呢?显然,这种方法不太合理。最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。
- 将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作。
二、Linux用户和组的关系
用户和用户组的对应关系有以下 4 种:
- 一对一:一个用户可以存在一个组中,是组中的唯一成员;
- 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
- 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
- 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
三、Linux UID和GID(用户ID和组ID)
登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在/etc/passwd
文件中。说白了,用户名并无实际作用,仅是为了方便用户的记忆而已。
如何论证 "Linux系统不认识用户名" ?
我们曾经在网络上下载过 ".tar.gz"格式的文件,在解压缩之后的文件中,你会发现文件拥有者的属性显示的是一串数字,这很正常,就是因为系统只认识代表你身份的 ID,这串数字就是用户的 ID(UID)号。
既然 Linux 系统不认识用户名,文件是如何判别它的拥有者名称和群组名称的呢?
每个文件都有自己的拥有者 ID 和群组 ID,当显示文件属性时,系统会在 /etc/passwd 文件中,利用 UID 可以找到对应的用户名;在 /etc/group 文件中,利用 GID 可以找到对应的群组名。
如果我们修改了 /etc/passwd 和 /etc/group 这两个文件会出现问题呢?
注意:为了说明 UID 和用户名的对应关系,所以才将 /etc/passwd 文件中用户的 UID 做了更改。此操作很可能会导致某些程序无法进行,因此 /etc/passwd 文件不能随意修改。
1、进入home目录查看 ,如下图所示:
2、我们先使用 root 账号登陆并执行 vim /etc/passwd
,文件中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式为:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
文件部分内容如下:
3、在该文件中找到 user1 账户并将其 UID(1002)随意改一个数字,这时当你查看普通账户拥有的文件时,你会发现所有文件的拥有者不再是 user1,而是数字1002。
4、执行vim /etc/group
,此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:
组名:口令:组标识号:组内用户列表
文件部分内容如下:
5、找到user2并修改其对应的 GID(1005),你会发现所有文件的所属组不再是 user2,而是数字1005。
6、由于 user1 账户的 UID 已经被修改,但其 home 目录却记录的是 1002,会导致此用户再次登录时无法进入自己的home目录。如下图所示: