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