此博客仅当学习笔记,所有内容均参考C语言中文网,望支持正版,至C语言中文网查看详细内容。
用户和用户组管理,顾名思义就是添加用户和用户组、更改密码和设定权限等操作。可能有很多人觉得用户管理没有意义,因为我们在使用个人计算机的时候,不管执行什么操作,都是以管理员账户登录,而从来没有添加和使用过其他普通用户。这样做对个人计算机而言问题不大,但在服务器上是不行的。
大家想象一下,我们是一个管理团队,共同维护一组服务器,难道每个人都能够被赋予管理员权限吗?显然是不行的,因为并不是所有的数据都可以对每位管理员公开,而且如果运维团队中有某位管理员对Linux不熟悉,那么赋予他管理员权限的后果可能是灾难性的。
因此,越是对安全性要求较高的服务器,越需要建立起合理的用户权限等级制度和服务器操作规范。
1 Linux 用户和用户组简介
Linux是多用户多任务操作系统,换句话说,Linux系统支持多个用户在同一时间内登录,不同用户可以执行不同的任务,并且互不影响。
例如,某台Linux服务器上有四个用户,分别是root、chen、ftp、和mysql,在同一时间内,root用户可能在查看系统日志、管理维护系统;chen用户可能在修改自己的网页程序;ftp用户可能在上传软件到服务器;mysql用户可能在执行SQL语句,每个用户互不干扰,有条不乱地进行着自己的工作。与此同时,每个用户之间不能越权访问,比如,chen用户不能执行mysql用户的SQL语句。
不同用户具有不同的权限,每个用户在权限允许的范围内完成不同的任务,Linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
因此,如果要使用Linux系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统(账户和用户是同一个概念)。通过建立不同属性的用户,一方面可以合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。
每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。
用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,如果有110000个呢?
显然,这种方法是不合理的。最好的方法是建立一个组,让这个组具备查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组里。那么所有用户就具有了和组一样的权限,这就是用户组。
将用户分组是Linux系统对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作。
用户和用户组的对应关系有以下4种:
- 一对一:一个用户可以存在于一个用户组中,且是组中的唯一成员
- 一对多:一个用户可以存在于多个用户组中,此用户具有多个组的共同权限
- 多对一:多个用户可以存在于一个用户组种,这些用户具有和组相同的权限
- 多对多:多个用户可以存在于多个用户组中。
2 Linux 用户和用户组ID(UID、GID)
登录Linux系统时,虽然输入的是自己的用户名和密码,但其实Linux并不认识你的用户名称,它只认识用户名对应的ID号(也就是一串数字)。Linux系统将所有用户的名称和用户ID的对应关系都存储在/etc/passwd
文件中。
Linux系统中,每个用户的ID可以细分为2种,分别是用户ID(User ID,简称UID)和用户组ID(Group ID,简称GID),这与文件拥有者和拥有群组两种属性相对应。
/home/chen/my/test.txt
文件属性展示:文件所有者 chen
,文件所有组 chen
。读者可能会问,既然Linux系统不认识用户名,文件是如何判断它的所有者名称和所有组名的呢?
因为文件属性信息中包含了自己的所有者ID(UID)和所有组ID(GID),系统会根据/etc/passwd
和/etc/group
文件中的内容,分别找到UID和GID对应的用户名和用户组名,然后显示出来。
3 Linux /etc/passwd 内容
Linux系统中的/etc/passwd
文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
首先,我们使用命令将文件打开
[chen@localhost~]$ vi /etc/passwd
显示内容如下:
可以看到,/etc/passwd
文件中的内容非常规律,每行记录对应一个用户。
Linux系统中默认怎么会有这么多用户?这些用户中的绝大多数都是系统或服务运行所必须的用户,这种用户通常称为系统用户或伪用户。
系统用户无法用来登录系统,但是也不能删除,因为一旦删除,依赖这些用户运行的程序或服务就不能正常执行,会导致系统问题。
不仅如此,每行用户信息都以:
作为分隔符,划分为7
个字段。
用户名:密码:UID:GID:描述性信息:主目录:默认Shell
chen:x:1000:1000:Chen:/home/chen:/bin/bash
3.1 用户名
用户名,就是一串代表用户身份的字符串。
前面讲过,用户名仅仅是为了方便用户记忆,Linux系统是通过UID来识别用户身份,分配用户权限的。/etc/passwd
文件中就定义了用户名和UID之间的对应关系。
3.2 用户密码
x
表示此用户设有密码,但不是真正的密码,真正的密码保存在/etc/shadow
文件中。
在早期的UNIX操作系统中,这里保存的就是真正的加密密码串,但由于所有程序都能读取此文件,非常容易造成用户数据被窃取。
虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。
因此,现在的Linux系统就把真正的加密密码串放在了/etc/shadow
文件中,此文件只对root用户设有读写权限,极大保证了用户密码的安全。
需要注意的是,虽然x
并不代表真正的密码,但是也不能删除,如果删除了x
,则系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登陆,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不行的。
3.3 UID
UID,User ID,每个用户都有唯一的一个UID,LInux系统通过UID来识别不同的用户。实际上,UID就是一个0~65535
之间的数,不同范围的数字表示不同的用户身份,具体如下表所示:
UID范围 | 用户身份 |
---|
0 | 超级用户root。UID为0就代表这个账号是管理员。在Linux中,如何把普通用户升级为管理员?只需要将其UID修改为0就可以。但是不建议建立多个管理员账号 |
1~499 | 系统用户。此范围的UID保留给系统使用。其中,1~99用于系统自行创建的账号;100 ~ 499分配给有系统账号需求的用户。其实除了0之外,其他的UID并无不同,只是默认500以下给系统留作保留账户,只是一个公认的习惯罢了 |
500~65535 | 普通用户。通常这些UID已经足够用户使用了,但是不够也没关系,Linux系统再逐渐扩展UID |
3.4 GID
GID,Group ID,表示用户初始组的ID。这里需要解释一下初始组和附加组的概念。
- 初始组。指用户登陆时就拥有这个用户组的相关权限。每个用户的初始用户组只能有一个,通常就是将和此用户的用户名相同的用户组名作为该用户的初始组。比如说,我们添加一个用户chen,在建立用户chen的同时,就会创建chen用户组作为chen用户的初始用户组。
- 附加组,指用户可以加入多个其他的用户组,并拥有这些用户组的权限。
每个用户只能有一个初始用户组,除此之外,用户再加入其他用户组,这些用户组就是这个用户的附加组。
附加组可以有多个,而且用户拥有这些附加组的权限
举例说明:chen用户除了属于初始用户组chen以外,将它加入users组,那么chen用户同时属于chen用户组和users用户组,其中,chen用户组是初始组,而users是附加组。
当然,初始组和附加组的身份是可以修改的,但一般不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
在此文件中的第4个字段看到的GID是初始组ID
3.5 用户说明
这个字段没用,只是用来解释这个用户的意义而已。
3.6 主目录
也就是用户登陆后有操作权限的访问目录,通常称为用户的主目录。
3.7 默认Shell
Shell就是Linux的命令解释器,是用户和Linux内核之间沟通的桥梁。
我们知道,用户登陆Linux系统后,通过使用Linux命令来完成操作任务,但系统只认识类似于0110
这类的机器语言,这里就需要命令解释器。也就是说,Shell可哟将用户输入的命令转换成系统可以识别的机器语言。
通常情况下,Linux系统默认使用的命令解释器是bash
(/bin/bash
)。如果将chen用户的Shell命令解释器修改为/sbin/nologin
,那么这个用户登陆后,不能使用相关的命令,如ls
,系统不会识别这些命令,同时意味着这个用户不能登陆。
4 Linux /etc/shadow 内容
/etc/shadow
文件,用于存储Linux系统中用户的密码信息,又称为影子文件。
前面介绍了/etc/passwd
文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此,Linux系统将用户的密码信息从/etc/passwd
文件中分离出来,并单独存放到/etc/shadow
文件。
/etc/shadow
文件只有root
用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
如果这个文件的权限发生了改变,则需要注意是否是恶意攻击
首先,我们使用命令将文件打开:
[root@localhost /]
同/etc/passwd
文件一样,文件中每行代表一个用户,同样使用:
作为分隔符,不同之处在于,每行用户信息被划分为9
个字段。
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限天数:账号失效时间:保留字段
4.1 用户名
同/etc/passwd
文件的用户名具有相同的含义。
4.2 加密密码
这里保存的是真正的加密密码。目前Linux使用的是SHA 512散列加密算法,原先采用的是MD5 或 DES加密算法。SHA 512 散列加密算法的加密等级更高,也更加安全。
注意,这串加密密码不能手工修改,如果手工修改,系统将无法识别密码,导致原来密码失效。很多软件透过这个功能,在密码串前加上!* 或 x 等使密码暂时失效
所有的伪用户的加密密码都是!!
或者*
,代表没有密码,是不能登陆的。当然,新创建的用户如果不设定密码,那么它的密码项也是!!
,代表这个用户没有密码,不能登陆。
4.3 最后一次修改时间
此字段表示最后一次修改密码的时间,可是为什么,chen用户显示的是19415
呢?
这是因为,Linux计算日期是以1970年1月1日作为1不断累加得到的。这里显示的19415
,也就是说,这个chen用户是在1970-01-01
后的19415
天修改的密码。
那么19415到底代表哪一天呢?可以使用以下命令换算:
[root@localhost /]
2023-02-27
。
4.4 最小修改时间间隔
最小修改时间间隔,也就是说,此字段规定了从第3字段(最后一次修改密码时间)起,多长时间之内不能修改密码。如果是0
,则密码可以随时修改;如果是10
,则代表密码修改后10
天内不能再次修改密码。
4.5 密码有效期
经常变更密码是一个好习惯。为了强制用户变更密码,这个字段可以指定距离第3字段多长时间内需要再次变更密码,否则对该用户密码进行过期处理。
该字段的默认值是999999
,也就是273年,可以认为是永久生效。管理服务器时,通过这个字段强制用户定期修改密码。
4.6 密码需要变更前的警告天数
与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。
该字段的默认值是 7
,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
4.7 密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。
比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0
,则代表密码过期后立即失效;如果是 -1
,则代表密码永远不会失效。
4.8 账号失效时间
同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!
该字段通常被使用在具有收费服务的系统中。
4.9 保留字段
这个字段目前没有使用,等待新功能的加入。
5 Linux /etc/group 内容
/etc/group
文件是用户组配置文件,即用户组的所有信息都存放在此文件中。
此文件是记录用户组名和用户组ID对应关系的文件。
首先,使用命令打开文件:
[root@localhost /]
可以看到,此文件中的一行就是一个用户组。各用户组中,还是以:
为分隔符,分为4
个字段。
用户组名:密码:GID:组中的用户
5.1 用户组名
也就是用户组的名称,由数字和字母组成。同/etc/passwd
中的用户名一样,用户组名不能重复。
5.2 用户组密码
和/etc/passwd
一样,这里的x
仅仅是有密码标识,真正加密后的用户组密码默认保存在/etc/gshadow
文件中。
不过,用户设置密码是为了验证用户的身份,那用户组设置密码是用来做什么的呢?用户组密码主要是用来指定管理员的,由于系统中的账号可能会非常多,root
用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root
进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo
命令代替。
5.3 GID
就是用户组的ID号,Linux系统就是通过GID来区分用户组的,同用户名一样,用户组名也仅仅是为了方便管理员记忆。
这里的GID和/etc/passwd
文件中第4字段的GID相对应。
5.4 附加用户
此字段列出每个用户组中包含的所有用户。
需要注意的是,如果该用户组是某用户是初始用户组,则该用户是不会写入这个字段的,可以这么理解,该字段显示的的用户都是这个用户组的附加用户
到此,我们已经学习了/etc/passwd
、/etc/shadow
、/etc/group
,它们之间的关系可以这样理解,即先在 /etc/group
文件中查询用户组的 GID 和组名;然后在 /etc/passwd
文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow
文件中提取和这个用户相匹配的密码。
6 Linux /etc/gshadow 内容
用户组信息存储在/etc/group
文件,而用户组密码信息存储在/etc/gshadow
文件。
首先,我们使用命令查看文件夹
[root@localhost /]
文件中,每行代表一个用户组密码信息,:
作为分隔字符,有4
个字段。
6.1 用户组名
同/etc/group文件中的用户组名对应。
6.2 用户组密码
对于大多数用户来说,通常不设置用户组密码,因此该字段为空,但有时为!
,指的是该用户组没有组密码,也不设有用户组管理员。
6.3 用户组管理员
从系统管理员角度来说,该文件最大的功能就是创建用户组管理员。那么,什么是用户组管理员呢?
考虑到Linux系统中用户众多,而超级管理员root
可能比较忙碌,因此当有用户想加入某用户组时,root
或许不能及时作出回应。这种情况下,如果设有用户组管理员,那么他就可以将用户加入到自己的用户组中,也免得去麻烦root
。
不过,由于目前有 sudo
之类的工具,因此用户组管理员的这个功能已经很少使用了。
6.4 附加用户
该字段显示用户组中有哪些附加用户,和/etc/group
文件中的附加用户一致。
7 Linux /etc/login.defs 内容
/etc/login.defs
是创建用户的默认设置文件,用于在创建用户时,对用户的一些基本属性做默认设置。
需要注意的是,该文件中的用户默认设置对root用户无效。并且,当此文件中的配置与/etc/passwd文件和/etc/shadow文件中的用户信息起冲突时,系统会以其他两个文件为准
设置项 | 含义 |
---|
MAIL_DIR /var/spool/mail | 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp。 |
PASS_MAX_DAYS 99999 | 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。 |
PASS_MIN_DAYS 0 | 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。 |
PASS_MIN_LEN 5 | 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。 |
PASS_WARN_AGE 7 | 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。 |
UID_MIN 500 | 指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。 |
UID_MAX 60000 | 指定用户最大的 UID 为 60000。 |
GID_MIN 500 | 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。 |
GID_MAX 60000 | 用户 GID 最大为 60000。 |
CREATE_HOME yes | 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。 |
UMASK 077 | 用户主目录的权限默认设置为 077。 |
USERGROUPS_ENAB yes | 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。 |
ENCRYPT_METHOD SHA512 | 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。 |
8 Linux /etc/default/useradd 内容
首先,我们使用命令查看文件内容
[root@localhost ~]
或
[root@localhost ~]
| |
---|
GR0UP=100 | 这个选项用于建立用户的默认组,也就是说,在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。但 CentOS 并不是这样的,而是在添加用户时会自动建立和用户名相同的组作为此用户的初始组。也就是说这个选项并不会生效。Linux 中默认用户组有两种机制:一种是私有用户组机制,系统会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。目前我们采用的是私有用户组机制。 |
HOME=/home | 指的是用户主目录的默认位置,所有新建用户的主目录默认都在 /home/下,刚刚新建的 yang 用户的主目录就为 /home/yang/。 |
INACTIVE=-1 | 指的是密码过期后的宽限天数,也就是 /etc/shadow 文件的第七个字段。这里默认值是 -1,代表所有新建立的用户密码永远不会失效。 |
EXPIRE= | 表示密码失效时间,也就是 /etc/shadow 文件的第八个字段。默认值是空,代表所有新建用户没有失效时间,永久有效。 |
SHELL=/bin/bash | 表示所有新建立的用户默认 Shell 都是 /bin/bash。 |
SKEL=/etc/skel | 在创建一个新用户后,你会发现,该用户主目录并不是空目录,而是有 .bash_profile、.bashrc 等文件,这些文件都是从 /etc/skel 目录中自动复制过来的。因此,更改 /etc/skel 目录下的内容就可以改变新建用户默认主目录中的配置文件信息。 |
CREATE_MAIL_SPOOL=yes | 指的是给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在 /var/spool/mail/ 目录下,和用户名相同。例如,yang 的邮箱位于 /var/spool/mail/yang |
通过/etc/default/useradd文件,大家仅能修改有关新用户的部分默认值,有一些内容并没有在这个文件中,例如修改用户默认UID、GID以及用户密码等的默认设置,对这些默认值的修改就需要在/etc/login/defs中。
9 Linux useradd命令:新建用户
Linux系统中,可以使用useradd
命令新建用户,此命令的基本格式如下:
[root@localhost ~]
选项 | 作用 |
---|
-u UID | 手工指定用户的UID,注意UID的范围(不要小于500) |
-d home | 手工指定用户的主目录。主目录必须写绝对路径。需要手工指定主目录的时候一定注意权限 |
-c comment | 手工指定/etc/passwd 文件中的第5个字段,可随意配置 |
-g GID | 手工指定用户的初始用户组 |
-G GID | 手工指定用户的附加用户组 |
-s shell | 手工指定用户的shell解释器,默认是/bin/bash |
-e days | 手工指定用户的失效日期,/etc/shadow 文件的第8个字段 |
-o | 允许创建的用户的UID相同。例如,useradd -u 0 -o yang 命令,创建用户yang,其UID和root的UID相同,都是0 |
-m | 用户创建时强制建立用户的家目录。在建立系统用户时,该选项是默认的 |
-r | 创建系统用户,也就是UID在1~4999之间的,供系统程序使用的用户。由于系统用户主要用于运行程序所需服务的权限配置,因此系统用户的创建默认不会创建主目录 |
其实,系统已经帮助我们规定了非常多的默认值,在没有特殊要求下,无需使用任何选项即可成功创建用户。
[root@localhost ~]
千万不要小看这条命令,它会完成以下几项操作:(9.1~9.6)
可以看到,useradd
命令创建用户的过程,其实就是修改了与用户相关的几个文件或目录,前面的章节已经讲过。
useradd
命令在添加用户时参考的默认值文件主要有两个,分别是/etc/login.defs
和/etc/default/useradd
。
其实,useradd 命令创建用户的过程是这样的,系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,也就是向 /etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了。
9.1 /etc/passwd
在 /etc/passwd
文件中新建了一行与yang
用户相关的数据
[root@localhost ~]
可以看到,yang
用户的UID默认为1001
,而之前chen
用户UID为1000
,初始用户组ID为1001
,家目录为/home/yang
,shell解释器为/bin/bash
9.2 /etc/shadow
在/etc/shadow
文件中新建了一行与yang
用户密码相关的数据
[root@localhost ~]
当前,这个新用户yang
还没有设置用户密码,所以加密密码字段是!!
,代表这个用户没有合理密码,不能正常登陆。同时会按照默认值设定时间字段,例如 99999:7
9.3 /etc/group
在/etc/group
文件中新建一行与用户组yang
相关的数据
[root@localhost ~]
该用户组会作为用户yang
的初始用户组。
9.4 /etc/gshadow
在/etc/gshadow
文件中新建一行与yang
用户组密码相关的数据
[root@localhost ~]
当然,我们没有设定yang
用户组密码,所以没有密码,也没有用户组管理员
9.5 默认创建用户的主目录和邮箱
[root@localhost ~]
[root@localhost ~]
9.6 /etc/skel
将/etc/skel
目录中的配置文件复制到用户yang
的主目录中
10 Linux passwd命令:修改用户密码
学习useradd
命令后,我们知道,使用此命令创建新用户时,并没有设定用户密码,因此还无法用来登陆系统,需要passwd
命令配置密码。
passwd
命令的基本格式如下:
[root@localhost~]
选项 | 作用 |
---|
-S | 查询用户密码的状态,也就是/etc/shadow 文件中此用户密码的内容。仅root 用户可用 |
-l | 暂时锁定用户,该选项会在/etc/shadow 文件中指定用户的加密密码前加“!”,使密码失效。仅root 用户可用 |
-u | 解锁用户,和-l选项相对应。仅root 用户可用 |
-stdin | 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户中使用 |
-n 天数 | 设置/etc/shadow 文件中第4字段 |
-x 天数 | 设置/etc/shadow 文件中第5字段 |
-w 天数 | 设置/etc/shadow 文件中第6字段 |
-i 日期 | 设置/etc/shadow 文件中第7字段 |
【例1】使用root
用户修改普通用户yang
的密码。
[root@localhost /]
Changing password for user yang.
New passwd: <<--直接输入新的密码
Retype new password: << -- 再次验证输入的密码
passwd:all authentication tokens updated successfully.
<< -- 提示修改密码成功
<< -- 用户:yang
<< -- 密码:csc020812
【例2】锁定、解锁用户yang
[root@localhost /]
Locking password for user yang.
passwd:Success << -- 提示锁定用户成功
[root@localhost /]
yang LK 2023-03-10 0 99999 7 -1 (Password locked).
<< -- 查询yang用户的密码状态
[root@localhost /]
Unlocking password for user yang.
passwd:Success << -- 显示解锁用户成功
[root@localhost /]
yang PS 2023-03-10 0 99999 7 -1 (Password set,SHA512 crypt.)
<< -- 查询yang用户密码状态
【例3】普通用户yang
修改自己的密码
[yang@localhost~]$ passwd
Changing password for user yang.
Changing password for yang.
(current) UNIX password: <<-- 输入旧密码 csc020812
New password: << -- 输入新密码 csc020812
BAD PASSWORD:The password is the same as the old one.
<< -- 口令验证不通过:新密码与旧密码一样
New password: << -- 输入新密码 Csc020812
BAD PASSWORD:The password differs with case changes only
<< -- 口令验证不通过:新密码与旧密码 只因大小写改变而不同
New password: << -- 输入新密码 CSC020812!
BAD PASSWORD:The password is too similar to the old one.
<< -- 口令验证不通过:新密码与旧密码 过于相似
注意,普通用户只能修改自己的密码,而不能修改其他用户的密码
可以看到,与使用root
用户修改普通用户密码不同,普通用户修改自己密码需要先输入自己的旧密码,只有旧密码输入正确才能输入新密码。不仅如此,此种修改方式对密码的复杂度有严格的要求,新密码太短、太简单、太相近都会被系统检测出来并禁止用户使用。
很多Linux发行版为了系统安装,都使用了PAM模块进行密码的检验,设置密码太短、与用户名相同、是常见的字符串等,都会被PAM模块检查出来,从而禁止用户使用此密码。
而使用root
用户,无论是修改普通用户的密码还是修改自己的密码,都可以不遵守PAM模块设定的规则。
11 Linux usermod命令:修改用户信息
前面介绍了如何利用useradd
命令新建用户,但如果不小心添错了用户信息,后期该如何修改呢?
方法有2个,一个是使用Vim编辑器手动修改设计用户信息的文件/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
;另一个就是使用usermod
命令,该命令专门用来修改用户信息。
这里一定要分清useradd命令与usermod命令,前者用于添加用户,当然,添加用户时可以对用户信息进行定制;后者针对已经存在的用户,使用该命令修改他们的信息。
usermod
命令的基本格式如下:
[root@localhost ~]
选项 | 作用 |
---|
-l login | 修改用户名,即修改/etc/passwd文件的第1个字段 。【例1】 |
-u UID | 修改用户的UID,即修改/etc/passwd文件的第3个字段 【例2】 |
-g GID | 修改用户的GID,即修改/etc/passwd文件中的第4个字段【例3】 |
-c comment | 修改用户的说明,即修改/etc/passwd文件中的第5个字段【例4】 |
-d home | 修改用户主目录,即修改/etc/passwd文件中的第6个字段 |
-s shell | 修改用户的登陆shell,即修改/etc/passwd文件中的第7个字段 |
-G GID | 修改用户的附加组,就是把用户加入到其他用户组。【例5】 |
-L | 临时锁定用户 |
-U | 解锁用户 |
【例1】修改yang
用户的用户名为Yang
[root@localhost~]
[root@localhost~]
<< -- 查询
【例2】 修改用户yang
的UID 1001
为 1002
[root@localhost~]
[root@localhost~]
/etc/shadow /etc/group /etc/gshadow
<< -- 查询用户信息
【例3】修改用户yang
的GID1001
为 1000
[root@localhost~]
[root@localhost~]
【例4】修改用户yang
的说明为chen_wife
.
[root@localhost~]
[root@localhost~]
【例5】将用户yang
添加入用户组chen
。
[root@localhost~]
[root@localhost~]
12 Linux userdel命令:删除用户
userdel
命令功能简单,就是删除用户的相关数据。此命令只有root
用户才能使用。
用户的相关数据主要包含以下几项:
- 用户基本信息:存储在
/etc/passwd
文件 - 用户密码信息:存储在
/etc/shadow
文件 - 用户组基本信息:存储在
/etc/group
文件 - 用户组密码信息:存储在
/etc/gshadow
文件 - 用户个人文件:主目录在
/home/login
文件,邮箱在/var/spool/mail/login
。login
是用户名。
其中,userdel命令的作用就是从以上文件中,删除与指定用户有关的数据信息
userdel
命令的基本格式如下:
[root@localhost~]
-r 选项表示在删除用户的同时删除用户的家目录。
如果在删除用户的同时不删除用户的家目录,那么用户的家目录就会变成没有属主和属组的目录,也就是垃圾文件。
[root@localhost~]
[root@localhost~]
[root@localhost~]
[root@localhost~]
[root@localhost~]
[root@localhost~]
[root@localhost~]
13 Linux id命令:查询用户的UID、GID
id
命令可以查询用户的uid
、gid
、groups
(附加组)的信息。
id
命令的基本格式:
[root@localhost~]
14 Linux su命令:临时切换用户
su
是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为root
用户,从root
用户切换为普通用户chen
以及普通用户chen
、yang
之间的切换。
普通用户切换到普通用户或root用户,需要知晓对方的用户密码;
root用户切换到普通用户,无需知晓对方的用户密码。
su
命令的基本格式如下:
[root@localhost~]
选项 | 作用 |
---|
- | 当前用户不仅切换用户的身份,同时所用的工作环境也切换为该用户的环境(如PATH环境变量、MAIL环境变量等),使用- 可以省略用户名,默认会切换为root 用户 |
-l login | 同-的使用类似,也就是在切换用户的同时,完整切换工作环境,但后面需要加预切换的用户 |
-p login | 切换为指定用户,但不改变当前的工作环境 |
注意,使用su
命令时,有-
和无-
是完全不同的,-
选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因为如果系统环境没有随用户身份切换,很多命令是无法执行的。
初学者可以这样理解它们之间的区别,即有-选项的,切换用户身份比较彻底;反之,只切换来一部分,这会导致某些命令运行出现问题
15 Linux whoami 与 who am i命令
whoami
命令和who am i
是2个不同的命令,前者用来打印当前执行操作的用户名,后者用来打印登陆当前Linux系统的用户名。
[root@localhost~]
root <<- 当前操作用户
[root@localhost~]
chen tty2 2023-03-04 04:42 <<- 登陆系统用户
[root@localhost~]
[root@localhost~]
chen <<- 当前操作用户
[root@localhost~]
chen tty2 2023-03-04 04:42 <<- 登陆系统用户
也就是说,使用su
命令切换用户身份,可以欺骗whoami
,但是欺骗不了who am i
。要解释这背后的运行机制,就要弄清楚什么是实际用户(UID)和有效用户(EUID)。
所谓实际用户,指的是登陆Linux系统所使用的用户,因此在整个登陆回话过程中,实际用户是不可能发生改变的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够用su
命令随意切换的。
一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,他们会出现差异。需要注意的是,二者之间出现差异,切换用户并不是唯一的触发机制。
16 Linux groupadd命令:添加用户组
添加用户组的命令是groupadd
,命令格式如下:
[root@loaclhost~]
【例1】创建用户组 hrbeu
[root@localhost~]
[root@localhost~]
17 Linux groupmod命令:修改用户组
groupmod
命令用于修改用户组的相关信息,命令格式如下:
[root@loaclhost~]
选项 | 作用 |
---|
-g GID | 修改用户组GID |
-n group_name | 修改用户组名 |
注意,用户名、用户组名、UID、GID等不要随意修改,因为非常容易导致管理员逻辑混乱。如果非要修改用户名或用户组名,建议删删除旧的,再重新建立新的
18 Linux groupdel命令:删除用户组
groupdel
用于删除用户组,命令基本格式为:
[root@loaclhost~]
通过前面的学习,使用groupdel
命令删除用户组,就是删除/etc/group
文件和/etc/gshadow
文件中有关目标用户组的数据信息。
【例1】删除之前建立的用户组hrbeu
[root@loaclhost~]
[root@loaclhost~]
注意,不能使用groupdel命令随意删除用户组。此命令仅能删除“非其某用户初始组”。
【例2】删除用户yang
的初始群组yang
。
[root@loaclhost~]
groupdel:cannot remove the primary group of user 'yang'
<< -- 提示无法删除
如果一定要删除初始组yang
,要么修改yang
用户的GID,要么删除yang
用户。
19 Linux gpasswd命令:把用户加入/退出用户组
为了避免系统管理员(root
)太忙碌,无法及时管理群组,我们使用gpasswd
命令给群组设置一个群组管理员,代替root
完成将用户加入/退出群组的操作。
gpasswd
命令的基本格式如下:
[root@loaclhost~]
选项 | 作用 |
---|
| 选项为空时,给群组设置用户组密码,仅root用户可用 |
-A login1,.. . | 设置用户组管理员为login1,…,仅root用户可用 |
-r | 移除用户组密码,仅root用户可用 |
-R | 让用户组密码失效,仅root用户可用 |
-a login | 将用户login加入用户组中 |
-d login | 将用户login退出用户组中 |
可以看出,除了root
可以管理用户组外,可以设置多个用户作为用户组管理员来管理群组,但是也只能执行“加入”和“退出”功能。
【例1】设置hrbeu
的群组的密码为123789
,并指定chen
用户为用户组管理员。
[root@loaclhost~]
[root@loaclhost~]
[root@loaclhost~]
Changing the password for group hrbeu.
New Password: << - 输入密码
Re-enter new password:<< - 再次输入密码
[root@loaclhost~]
[root@loaclhost~]
【例2】以chen
用户执行操作,将chen
用户和yang
用户加入hrbeu
群组。
[root@loaclhost~]
[chen@loaclhost~]$ gpasswd -a chen hrbeu <<-加入群组
Adding user chen to group hrbeu
[chen@loaclhost~]$ gpasswd -a yang hrbeu <<-加入群组
Adding user yang to group hrbeu
[chen@loaclhost~]$ id chen
[chen@loaclhost~]$ id yang
前面讲过使用usermod -G
命令也可以将用户加入用户组,但会产生一个问题,即使用此命令将用户加入新的用户组后,该用户之前加入的用户组会被清空。
因此,将用户加入或退出用户组,最好用gpasswd命令
20 Linux newgrp命令:切换用户的有效组
我们知道,每个用户属于一个初始组(用户是这个用户组的初始用户),也可以属于多个附加组(用户是这个用户组的附加用户)。既然用户可以属于这么多的用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?当然是初始用户组的身份生效,因为初始组是用户一旦登陆就获得的组身份。
【实际用户 (real user id)】
实际用户就是登陆到shell的时候的用户,也就是最开始的用户。在之前讨论whoami
和who am i
的区别时,也涉及到了这个概念。在这里再次强调一下,who am i
所列出的就是实际用户。
【有效用户(effective user id)】
所谓有效用户,就是用su
或者su -
所切换到的用户。用whoami
所列出的就是这个有效用户。如果你执行了一个命令产生了一个进程,那么此进程的USER就是有效用户ID
【有效用户组】
有效用户组表示用户此时此刻所在的用户组是什么。有些同学会问“难道用户所在的用户组还会来回来去的变么?”。答案是肯定的。这都是newgrp
命 令搞得鬼,它可以帮助用户转换到不同的用户组。比如newgrp group123
,就可以让用户转换到group123
用户组了。请注意,这种转换的背后原理是“创建一个新的子shell”,恢复到原来用户组的方法是 用exit
或ctrl-D
来注销当前的shell。
好了,说结论吧,有效用户组就是用newgrp
命令所切换到的用户组。(当然,如果你一次也没有使用newgrp
命令,那么有效用户组就是初始用户组喽)
当然,你可以用groups
命令来列出当前用户所支持的所有用户组。(在有些系统中,第一个列出的就是有效用户组,但有些系统并不这么做)
还有一点应该注意,就是当你建立一个文件时,此文件的所属用户组就是创建人当前的有效用户组。
newgrp
命令的基本格式如下:
[root@loaclhost~]
[chen@localhost~]$ id chen
uid = 1000(chen) gid = 1000(chen) groups=1000(chen),10(wheel),1002(hrbeu)
[chen@localhost~]$ newgrp chen <<-切换有效用户组
[chen@localhost~]$ touch /home/chen/wen1 << - 建立文件
[chen@localhost~]$ newgrp hrbeu <<-切换有效用户组
[chen@localhost~]$ touch /home/chen/wen2 << - 建立文件
[chen@localhost~]$ ls -l/home/chen/wen1 /home/chen/wen2
可以看到,每一次使用newgrp
切换有效用户组时,用户都会切换到一个新的子shell里面,如果想回到本来的环境,需要不断使用exit
命令退回当前进程的父进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)