Linux【5】-用户管理(UID/GID)

Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。

例如,某台 Linux 服务器上有 4 个用户,分别是 root、www、ftp 和 mysql,在同一时间内,root 用户可能在查看系统日志、管理维护系统;www 用户可能在修改自己的网页程序;ftp 用户可能在上传软件到服务器;mysql 用户可能在执行自己的 SQL 查询,每个用户互不干扰,有条不紊地进行着自己的工作。与此同时,每个用户之间不能越权访问,比如 www 用户不能执行 mysql 用户的 SQL 查询操作,ftp 用户也不能修改 www 用户的网页程序。

不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。

因此,如果要使用 Linux 系统的资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统(账户和用户是一个概念)。通过建立不同属性的用户,一方面可以合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。

每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。

用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有 10 个用户的话,就需要授权 10 次,那如果有 100、1000 甚至更多的用户呢?

显然,这种方法不太合理。最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。

将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作。

一、用户和用户组

UID 是确认用户权限的标识,用户登录系统所处的角色是通过 UID 来实现的,而非用户名,因此,每个用户的 UID 必须是唯一的。UID 的唯一性是要管理员来确保的,其实通过修改/etc/passwd 文件,可以让任何用户的 UID 的值为 0,但是让几个用户共用一个 UID 是危险的,而普 通用户和 root 共用一个 UID ,那是尤其危险的事情,因为这事实上就造成了系统管理权限的混乱。

用户:

  • 管理员用户 root 0
  • 虚拟用户 1-499
  • 普通用户,常用用户

CentOS 系统会把前 499 个 UID 预留出来,给系统虚拟用户占用,虚拟用户一般是系统安装时就有的,是为了完成系统任务所必须的用户,但虚拟用户是 不能登录系统的,比如 ftp、nobody、adm、rpm、bin、shutdown 等。

添加普通用户时的 UID 从 500 开始的,GID (用户组)也是从 500 开始,至于其它系统,有的系统可能会把前999 UID和GID预留出来;以各个系统中/etc/login.defs文件中的 UID_MIN 的最小值为准; CentOS 系统 login.defs 的 UID_MIN 是500,而 UID_MAX 值为 60000,也就是说我们通过 useradd 添加的普通用户的UID 的值一般都是在 500 到 60000 之间。

ID 和 UID 类似,是一个正整数或 0,GID 从 0 开始,GID 为 0 的组让系统付予给 root 用户组;系统会预留一些较靠前的 GID 给系统虚拟用户(也被称为 伪装用户)之用;每个系统预留的 GID 都有所不同,比如 CentOS 预留了 500个,我们添加新用户组时,用户组是从 500 开始的;查看系统添加用户组默认 的 GID 范围应该查看 /etc/login.defs 中的 GID_MIN 和 GID_MAX 值。

  • Linux 是真正意义上的多用户操作系统,用户(user)在系统中是分角色的,由于角色不同,权限和所完成的任务也不同。
  • 通俗来说,用户组(group)就是具有相同权限的用户的集合体。
  • 用户和用户组的对应关系可以是是一对一、多对一、一对多或多对多,一个用户可以从属于多个用户组,一个用户组也可以包含多个用户,但是在同一时间,一个用户的主用户组(primary group)或者说有效用户组(effective group)只能有一个。主要是用户在创建文件时,为了这个文件从属用户组。
  • 系统管理员能在 Linux 系统中建若干普通用户。每个用户都有自己的家目录,对自己家目录中的文件有完全的操控权限,对系统有有限的权限,在默认情况下,每个新建的普通用户都从属于一个单独的和用户名同名的用户组。
  • 当然用户的概念理解还不仅仅于此,在 Linux 系统中还有一些用户是用来完成特定任务的,称为虚拟用户,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如 bin、daemon、adm、ftp、 mail、nobody 等。我们的浏览器,就是 nobody 用户,我们匿名访问ftp 时,会用到用户 ftp。这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户。

用户和用户组的对应关系有以下 4 种:

  • 一对一:一个用户可以存在一个组中,是组中的唯一成员;
  • 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
  • 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
  • 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。

二、查看用户和用户组

登陆 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 对应的用户名和群组名,然后显示出来。

查看用户可以使用两个命令 id 和 finger,这两个命令各有测重,id 工具更测 重用户、用户所归属的用户组、UID 和 GID 的查看;而 finger 测重用户信息 的查询,比如用户名(登录名)、家目录、登录 SHELL 类型等等。

查看某个指定用户的 UID,其初始用户组的 GID,以及它所从属的其他 用户组,如果不指定用户名,则是查看调用者的相关信息。

id [用户名]

查询用户相关信息的,比如用户名(登录名)、家目录、登录 SHELL 类 型等等

finger 用户名

六、简单的案例

1.新建phpq用户

adduser phpq
passwd phpq //给phpq用户设置密码

2、建工作组

groupadd test //新建test工作组

3、新建用户同时增加工作组

useradd -g test phpq //新建phpq用户并增加到test工作组

注::-g 所属组 -d 家目录 -s 所用的SHELL

4、给已有的用户增加工作组

usermod -G groupname username

或者:gpasswd -a user group

5、临时关闭:在/etc/shadow文件中属于该用户的行的第二个字段(密码)前面加上就可以了。想恢复该用户,去掉即可。

或者使用如下命令关闭用户账号:

passwd peter –l

重新释放:

passwd peter –u

6、永久性删除用户账号

userdel peter
groupdel peter
usermod –G peter peter (强制删除该用户的主目录和主目录下的所有文件和子目录)

7、从组中删除用户

编辑/etc/group 找到GROUP1那一行,删除 A 或者用命令

gpasswd -d A GROUP

8、显示用户信息

id user
cat /etc/passwd

9、修改用户默认主文件夹

From Linux Change Default User Home Directory While Adding A New User:

Simply open this file using a text editor, type:

vi /etc/default/useradd
The default home directory defined by HOME variable, find line that read as follows:

HOME=/home
Replace with:

HOME=/iscsi/user
Save and close the file. Now you can add user using regular useradd command:

# useradd vivek
# passwd vivek
Verify user information:

# finger vivek

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn