Linux-----13、用户、组

# 用户、组

# 一、用户管理

# ㈠ 用户概念及作用(了解)

**用户:**指的是Linux操作系统中用于管理系统或者服务的人

一问:管理系统到底在管理什么

答:Linux下一切皆文件,所以用户管理的是相应的文件

二问:如何管理文件呢?

答:

  1. 文件基本管理,比如文件的创建、删除、复制、查找、打包压缩等;文件的权限增加、减少等;

  2. 文件高级管理,比如程序文件的安装、卸载、配置等。终极目的是对外提供稳定的服务。

# ㈡ 用户的分类(了解)

# 1、超级用户
  • 超级用户,也叫管理员,root。该用户(root)具有所有权限,UID=0并且绝对只能是0。
# 2、系统用户
  • 系统用户,也叫程序用户。一般都是由程序创建,用于程序或者服务运行时候的身份。

  • 默认不允许登录系统。1<=UID<=499

  • 比如后面要学的web服务的管理用户apache,文件共享ftp服务的管理用户ftp等

注意:Centos7/RHEL8中,系统用户UID范围:1<=UID<=999

# 3、普通用户
  • 普通用户,一般都是由管理员创建,用于对系统进行有限的管理维护操作。

  • 默认可以登录系统。500<=UID<=60000

注意:Centos7/RHEL8中,普通用户UID范围:1000<=UID<=60000

特别说明

  1. 用户指的是操作系统上管理系统或服务的人,是人,就有相关的属性信息

  2. 用户的属性信息包括但不限于,如:家目录、唯一身份标识(UID)、所属组(GID)等

  3. 今天我们讨论的用户指的是普通用户,即由管理员创建的用户

# ㈢ 用户的基本管理(掌握)

# 1、创建用户(useradd)
# (1) 基本语法和选项
useradd [选项] 用户名
常用选项:
-u 指定用户uid,唯一标识,必须唯一
-g 指定用户的默认组(主组)
-G 指定用户附加组(一个用户可以加入多个组,但是默认组只有一个)
-d 指定用户家目录(每个用户都有一个自己的家,并且默认在/home/xxx)
-s 指定用户默认shell查看系统支持的shell(命令解释器)
[root@heima ~]# cat /etc/shells
/bin/sh 软连接文件
/bin/bash 系统默认的解释器
/usr/bin/sh 软连接文件
/usr/bin/bash 系统默认的解释器其他shell:
/sbin/nologin 不能登录操作系统,也叫非交互式shell
/bin/dash
/bin/tcsh
/bin/csh
# (2) 举例说明
# ① 创建默认用户
创建一个用户stu1
[root@heima ~]# useradd stu1
查看用户信息
[root@heima ~]# id stu1
uid=501(stu1) gid=501(stu1) groups=501(stu1)注意:当创建一个默认用户时,系统会给该用户以下东西,以stu1为例说明1)用户的UID(唯一标识) 501(系统自动分配)
2)用户的默认组(主组) stu1组,默认跟该用户的用户名一致;组ID(501),默认和用户UID一致
3)用户的家目录 /home/stu1
4)拷贝相应的文件到用户的家里
[root@heima ~]# su - stu1
[stu1@localhost ~]$ ls -a
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla

image-20231101113024070

# ② 根据需求创建用户

1、创建用户,不允许登录

2、创建用户,指定家目录

1. 创建用户stu2,但是不能登录操作系统
注意:-s 指定用户的默认shell,/sbin/nologin表示不能登录系统,也叫非交互
[root@heima ~]# useradd -s /sbin/nologin stu2
验证:
[root@heima ~]# id stu2
uid=502(stu2) gid=502(stu2) groups=502(stu2)
切换用户失败,说明该用户不能登录系统
[root@heima ~]# su - stu2
This account is currently not available.2. 创建用户stu2,同时指定该用户的家目录为/rhome/stu2
注意:-d 指定用户的家目录,前提该用户家目录的上一级目录/rhome必须存在[root@heima ~]# mkdir /rhome
[root@heima ~]# useradd -d /rhome/stu2 stu2
[root@heima ~]# id stu2
uid=502(stu2) gid=502(stu2) groups=502(stu2)
说明:指定stu2家目录/rhome/stu2时,只需要/rhome存在即可,系统会默认在/rhome下创建stu2目录
自己创建的目录中没有 “家具文件”,可以从 /etc/skel/ 下拷贝到家中即可
# 2、用户密码设置(passwd)

两个方式:

1.交互式:passwd 用户名

2.非交互:echo 密码|passwd --stdin 用户名

passwd 用户名 表示给指定用户修改密码
passwd 直接回车 表示给当前用户修改密码[root@heima ~]# passwd stu1
Changing password for user stu1.
New password: 密码不显示
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password: 密码不显示
passwd: all authentication tokens updated successfully.说明:
1.管理员root可以给任何用户修改密码
2.普通用户可以自己给自己修改密码,但是密码复杂度要符合规范[root@heima ~]# echo 123|passwd --stdin stu2
更改用户 stu2 的密码 。
passwd:所有的身份验证令牌已经成功更新。说明:使用这种方法不用交互可以直接设置成功,一般用于脚本中。
管道符“|”一般是将上一个命令的输出作为标准输入交给下一个命令
--stdin 标准输入
# ① 保存用户信息的文件

/etc/passwd

/etc/shadow

1. 用户信息保存文件/etc/passwd
了解相关配置文件内容,可以通过求man文档解决,即 man 5 passwd以冒号:分割为7列,如下:
account --> stu1 用户名称
password --> x 密码,将密码单独存放在另外一个文件中
UID --> 501 用户ID
G  ID --> 501 组ID
GECOS --> 用户自定义,描述说明
directory --> /home/stu1 用户的家目录
shell --> /bin/bash用户的默认shell,其中/sbin/nologin表示非交互,不能登录系统2. 用户密码信息保存文件/etc/shadow
了解相关配置文件内容,可以通过求man文档解决,即 man 5 shadow以冒号:分隔为9列,如下:login name登录的用户名
encrypted password加密后的密码;!!表示没有设置密码
date of last password change最后一次更改密码的天数(距离1970年的1月1日到现在的天数)值0有特殊含义,即用户下次登录系统时应更改密码。
minimum password age密码的最小生存周期;0表示可以立刻修改密码;如果是3,则表示3天后才能更改密码
maximum password age密码的最大生存周期;如果30表示每隔30天需要更新一次密码
password warning period 密码过期前几天发出警告;7表示过期前7天开始警告
password inactivity period密码的宽限期;如果3表示允许密码过期3天,3天内还能登录系统,但是要求修改密码。3天后(密码过期3天后账户被封锁,需要联系管理员)
account expiration date账户过期的时间,账户过期的用户不能登录;密码过期用户不能用原来的密码登录。以1970年1月1日算起。
reserved field保留

② 更改用户的账号信息(chage)

chage --help
-d 修改用户最后一次更改密码的时间
-m 修改密码的最小存活期(几天后才能修改密码)
-M 修改密码的最大存活期(每隔多少天更新一次密码)
-W 修改密码过期前警告(过期前几天发出警告)
-I 修改允许密码过期几天
-E 修改账户过期时间
-l 列出账户的信息举例说明:
查看用户账号的相关信息命令:chage -l stu1
[root@heima ~]# chage -l stu1
Last password change : Mar 04, 2019
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7修改用户账号的过期时间:2019-03-10过期
[root@heima ~]# chage -E '2019-03-10' stu1
[root@heima ~]# chage -l stu1
Last password change : Mar 04, 2019
Password expires : never
Password inactive : never
Account expires : Mar 10, 2019
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7修改用户账号的过期时间为10天以后:
[root@heima ~]# chage -E $(date +%F -d '+10days') stu1修改用户登录后需要修改密码
chage -d 0 用户名

image-20231102102351590

# 3、修改用户信息(usermod)
# ① 基本语法选项
usermod [选项] 用户名
常用选项:
-u 指定用户uid,唯一标识,必须唯一
-g 指定用户的默认组(主组)
-G 指定用户附加组(一个用户可以加入多个组,但是默认组只有一个)
-d 指定用户家目录(每个用户都有一个自己的家,并且默认在/home/xxx)
-s 指定用户默认shell
-m 移动用户家目录,和-d一起使用
# ② 举例说明
1. 修改stu3用户的UID为1100
[root@heima ~]# usermod -u 1100 stu3[root@heima ~]# tail -5 /etc/passwd
yunwei:x:1001:1001::/home/yunwei:/sbin/nologin
stu1:x:1002:1002::/home/stu1:/bin/bash
stu2:x:1003:1003::/rhome/stu2:/bin/bash
stu3:x:1100:1004::/rhome/stu3:/bin/bash
stu4:x:1005:1005::/home/stu4:/sbin/nologin2.修改stu4用户的默认shell为可登录系统
[root@heima ~]# su - stu4
This account is currently not available.
[root@heima ~]# usermod -s /bin/sh stu4
[root@heima ~]# tail -5 /etc/passwd
yunwei:x:1001:1001::/home/yunwei:/sbin/nologin
stu1:x:1002:1002::/home/stu1:/bin/bash
stu2:x:1003:1003::/rhome/stu2:/bin/bash
stu3:x:1100:1004::/rhome/stu3:/bin/bash
stu4:x:1005:1005::/home/stu4:/bin/sh3.修改stu5用户的家目录
[root@heima ~]# useradd -d /rhome/stu5 stu5
[root@heima ~]# usermod -md /home/stu5 stu5
# 4、删除用户(userdel)
# ① 基本语法选项
userdel [选项] 用户名
常用选项:
-r 删除用户并且移除其家目录和邮箱
-f 强制删除正在登录的用户
# ② 举例说明
说明:
创建完用户后,家目录默认在/home/用户名下;用户的邮箱在/var/spool/mail/用户名
1. 删除stu4用户以及家目录
[root@heima ~]# userdel -r stu4
[root@heima ~]# id stu4
id: stu4: No such user2.强制删除一个正在登录的用户
[root@heima ~]# userdel -r stu5
userdel: user stu5 is currently used by process 7998
[root@heima ~]# id stu5
uid=1101(stu5) gid=1101(stu5) 组=1101(stu5)
[root@heima ~]# userdel -rf stu5
userdel: user stu5 is currently used by process 7998
[root@heima ~]# id stu5
id: “stu5”:无此用户3. 只删除用户user02,不删除其家目录
[root@heima ~]# userdel stu1

# ㈣ 总结

# 1、创建用户(useradd)

1)useradd 用户名——>家目录/home/用户名、邮箱、UID、默认组(GID)[用户主组]

2)useradd [选项] 用户名字——>常用选项:-d/-s/-u/-g/-G

# 2、设置用户密码(passwd)

1)passwd 用户名——>给指定的用户(管理员可以给任何人设置任何密码)

2)echo 密码|passwd --stdin 用户名——>非交互式(用于脚本中)

3)用户基本信息和用户密码信息保存文件——>/etc/passwd和/etc/shadow

4)扩展chage命令——>用来修改用户密码信息(账号过期时间、密码最小生存周期等)

# 3、修改用户信息(usermod)

1)usermod [选项] 用户名——>usermod -md 新家 用户名

# 4、删除用户(userdel)

1)userdel 用户名——>只删除用户,不删除用户家目录、邮箱等信息

2)userdel -r 用户名——>删除用户以及用户其他信息

3)userdel -f 用户名——>强制删除用户(删除正在登录的用户)

# 二、组管理

# ㈠ 组和用户的关系(理解)

image-20231102104849417

**核心:**组的目的是为了方便管理用户

  • 用户是操作系统上管理维护系统或服务的人

  • 组是用户的一个属性信息

  • 任何一个用户默认都会有一个主组(默认组)

  • 一个用户除了主组也可以有多个其他组(附加组)

**一问:**用户的主组和附加组到底有啥关系呢?

**答:**用户的主组和附加组半毛钱关系都木有

**二问:**那要这个主组或者附加组有啥用呢?

答:肯定是有用的,组的目的是方便管理用户,用户的目的是管理操作文件,文件就有权限这个属性。

  1. 用户要操作一些文件,文件是由用户创建,不同用户创建的文件的属性信息也就不一样

  2. 文件的属性都有啥呢?比如,文件的创建者,文件属于哪个组,文件大小,文件时间等

  3. 其中,不同用户所创建的文件的属组就是该用户的主组(默认组)

  4. A用户附加组也有可能是其他用户的主组,道理同上(权限章节再细细体会组的作用)

# ㈡ 组的管理(掌握)

# 1、创建组(groupadd)

/etc/group 组信息文件

# ① 基本语法
groupadd [选项] 组名
常用选项:
-g 指定组的GID(编号),默认唯一
# ② 举例说明
1.创建一个组admin
[root@heima ~]# groupadd admin2.查看组信息
[root@heima ~]# tail -1 /etc/group
admin:x:1005:
说明:关于/etc/group配置文件说明,可以man 5 group找帮助3.创建一个组sysadmin,指定组的GID为1111
[root@heima ~]# groupadd -g 1001 sysadmin
[root@heima ~]# tail -1 /etc/group
admin:x:1005:
sysadmin:x:1111
# 2、删除组(groupdel)
# ① 基本语法
groupdel 组名

② 举例说明

[root@heima ~]# groupdel admin
[root@heima ~]# groupdel stu2
groupdel: cannot remove the primary group of user 'stu2'
注意:以上信息说明不能删除属于其他用户的主组
# 3、组成员管理(gpasswd)

/etc/gshadow 组文件

# ① 基本语法
gpasswd [选项] 组名
常见选项:
-a 添加用户到组
-d 从组中删除成员
-A 指定管理员
-M 指定组成员(会覆盖),可以批量添加用户到组中
-r 删除密码gpasswd 组名 给组设置密码
# ② 举例说明
  • 添加用户到组里

    1. 创建3个用户user01~user03
    2. 将user01添加到sysadmin组里
    方法:1:指定user01用户的附加组为sysadmin(站在用户角度)
    # usermod -G sysadmin user01方法2:使用gpasswd命令添加用户到组里
    # gpasswd -a user01 sysadmin
    -a选项:表示往组里追加用户# gpasswd -M user02,user03 sysadmin 设置sysadmin组成员为user02,user03
    -M选项:表示覆盖设置组成员(会覆盖原来的成员列表)# gpasswd -A stu2 admin
    指定admin
  • 删除组成员

    将user03用户从组sysadmin里移除
    # gpasswd -d user03 sysadmin

# ㈢ 课堂练习

  1. 创建一个admin组,组id为900

  2. 创建一个用户tom,并且admin组作为tom用户的附加组(要求在建立用户的时候就完成),密码为123

  3. 创建一个用户jack,要求在建立用户之后使用gpasswd把jack加入到该组,密码为123

  4. 给admin组设定一个默认密码为123 (gpasswd命令)

  5. 把tom用户设定为admin组的组管理员(gpasswd命令)

# ㈣ 总结

# 1、创建组(groupadd)

组的信息保存文件——>/etc/group和/etc/gshadow

# 2、删除组(groupdel)

什么样的组不能删除?——>不能删除属于其他用户的主组

# 3、管理组成员(gpasswd)

1)添加用户到组里——>gpasswd -a user1 组名 或 gpasswd -M user1,user2,… 组名

2)从组里移除用户——>gpasswd -d user1 组名

# 任务实施

一、创建coding组

# groupadd coding

二、创建用户

# useradd -G coding lidamao
# useradd -G coding wangergou

三、给用户设置密码

# passwd lidamao
# echo 123|passwd --stdin wangergou

# 作业1

  1. 创建一个公司itcast,3个部门财务(cw),人事(rs),市场(sc)

    说明:实际是创建4个组,分别为itcast、cw、rs、sc,没有包含的关系

  2. 每个部门创建2个用户,如 cw01 cw02,rs01,rs02,sc01,sc02;boss01管理公司所有部门;

    说明:boss01管理所有部门说明,boss01的附加组为财务、人事和市场部门

  3. 所有用户账号有效期3个月<90天>,第一次登录强制修改密码,每隔15天更新一次密码;默认密码为123456

# 作业2

  1. 添加3个用户,用户harry,natasha,sarsh,要求harry,natasha用户的附加组为admin组,sarsh用户的登录shell为非交互式shell。密码均为redhat

  2. 修改harry用户的家目录为/home/heima/redhat/harry

  3. 修改natasha,sarsh用户的主组为heima,并且可以登录系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UML】第6篇 用例图

目录 一、什么是用例图 二、参与者 2.1 什么是参与者 2.2 如何识别参与者 2.3 参与者之间的关系 从今天开始&#xff0c;就到了最干的各种的图的梳理和学习了&#xff0c;未来AI就能编码了&#xff0c;把业务建模和设计的基本功打好&#xff0c;也许能和AI和平相处呢。 一…

UART协议——FPGA代码篇

一.串口&#xff08;UART&#xff09;协议简介 UART 串口通信有几个重要的参数&#xff0c;分别是波特率、起始位、数据位、停止位和奇偶检验位&#xff0c;对于两个使用UART 串口通信的端口&#xff0c;这些参数必须匹配&#xff0c;否则通 起始位&#xff1a;表示数据传输的开…

科技云报道:至简至强,新一代服务器的算力美学

科技云报道原创。 在这个时代&#xff0c;数据和计算的边界正在迅速扩张。 随着云计算、物联网和人工智能的日益成熟&#xff0c;对算力的需求已经突破了传统的限制&#xff0c;进入了一个全新的阶段。在这个阶段&#xff0c;不仅是算力的量级发生了变化&#xff0c;其性质和…

2-以太坊虚拟机

以太坊虚拟机&#xff0c;简称EVM&#xff0c;是用来执行以太坊上的交易的。业务流程如下图&#xff1a; 输入一笔交易&#xff0c;内部会转换成一个Message对象&#xff0c;传入EVM执行。 如果是一笔普通转账交易&#xff0c;那么直接修改StateDB中对应的账户余额即可。如果…

数据结构:树(Tree)

树型结构 树的概念 树是一种非线性结构&#xff0c;他是由n&#xff08;n>0&#xff09;个有限结点组成的一个具有层次关系的集合。 当n0时&#xff0c;该树为空树。 在任意一个非空树中都满足以下条件&#xff1a; 1、有一个特殊的结点&#xff0c;称为根结点&#xff0c…

GaussDB数据库表创建行访问控制策略

目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…

关于#c语言#的问题:分析递归调用的过程◇画出调用过程各语句执行过程

关于#c语言#的问题&#xff1a;分析递归调用的过程◇画出调用过程各语句执行过程 当涉及到递归调用的过程时&#xff0c;可以通过绘制函数调用栈来分析和理解递归的执行过程。下面是一个示例的C语言递归函数和相应的调用过程&#xff1a; #include <stdio.h>void recurs…

详解 Jeecg-boot 框架如何配置 elasticsearch

目录 一、下载安装 Elasticsearch 1、 地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 2、下载完成后&#xff0c;解压缩&#xff0c;进入config目录更改配置文件 3、 修改配置完成后&#xff0c;前往bin目录启动el 4、访问&#xff1a;localhost:92…

【Stm32-F407】全速DAP仿真器下载程序

文章内容如下: 1) 全速DAP仿真器简介2) 全速DAP仿真器下载程序流程 1) 全速DAP仿真器简介 1&#xff09;全速DAP仿真器简介 DAP全称 Data Acquisition Processor&#xff0c;是一种用于数据采集和实时控制的设备。本文使用的全速DAP仿真器遵循ARM公司的CMSIS-DAP标准&#xff…

采购oled屏幕,应注意什么

在采购OLED屏幕时&#xff0c;应注意以下几点&#xff1a; 规格和参数&#xff1a;了解OLED屏幕的规格和参数&#xff0c;包括尺寸、分辨率、亮度、对比度、响应时间等。确保所采购的屏幕符合项目的需求和预期效果。 品质和可靠性&#xff1a;选择具有可靠品质和稳定性的OLED屏…

Docker单点部署[8.11.3] Elasticsearch + Kibana + ik分词器

文章目录 一、Elasticsearch二、Kibana三、访问四、其他五、ik分词器第一种&#xff1a;在线安装第二种&#xff1a;离线安装 Elasticsearch 和 Kibana 版本一般需要保持一致才能一起使用&#xff0c;但是从 8.x.x开始&#xff0c;安全验证不断加强&#xff0c;甚至8.x.x之间…

geemap学习笔记029:使用Earth Engine数据--几何(Geometry)数据

前言 从本节开始将会分类别的进行学习&#xff0c;例如使用Earth Engine数据、使用本地地理数据、可视化地理数据、分析地理数据等&#xff0c;当然前面介绍过的&#xff0c;就不再赘述。 1 导入库并显示地图 import ee import geemapee.Initialize()2 创建几何对象-1 Map …

电子商务网站知识|搭建自己的电子商务网站需要注意什么|搭建电商独立站的注意事项

电子商务网站建设步骤包括什么呢? 电子商务网站建设第一步&#xff0c;网站的规划与设计 电子商务网站算是一个比较复杂的系统&#xff0c;电商网站建设前就要想好需要有的功能。电子商务网站的规划也是建所有网站都需要做的事情&#xff0c;在规划设计中需要对网站进行整体…

【计算机网络】TCP协议——1.报文格式详解

前言 上篇讲解了UDP报文格式。TCP和UDP是同层协议&#xff0c;都属于传输层&#xff0c;数据来源于上层——应用层 目录 一. TCP协议概述 二. TCP报文格式 1. 两个问题 2. 确认号和序列号 3. 标志位字段 4. 窗口大小 5. 校验和字段 6. 紧急指针与紧急数据 7. 选项字…

【uniapp小程序-上拉加载】

在需要上拉加载的页面的page.json上添加红框框里面的 onReachBottom() {if(this.commentCurrent<this.commentTotal){this.commentCurrent 1; this.commentList();this.status loading;}else{this.status ;} }, methods:{commentList(){let params {courseid:this.cour…

QUIC在零信任解决方案的落地实践

一 前言 ZTNA为以“网络为中心”的传统企业体系架构向以“身份为中心”的新型企业安全体系架构转变&#xff0c;提供解决方案。随着传统网络边界不断弱化&#xff0c;企业SaaS规模化日益增多&#xff0c;给终端安全访问接入创造了多元化的空间。其中BYOD办公方式尤为突出&#…

统一日志管理方案:Spring项目logback日志与logstash和Elasticsearch整合

原创/朱季谦 最近在做一个将分布式系统的日志数据通过logstash传到kafka的功能&#xff0c;做完之后决定业余搭一个ELK日志分析系统&#xff0c;将logstash采集到的日志传给Elasticsearch。经过一番捣鼓&#xff0c;也把这个过程给走通了&#xff0c;于是写了这篇总结&#xff…

Linux发行版比较:Ubuntu、CentOS、Red Hat与其他系统的优劣分析

导言 Linux作为开源操作系统&#xff0c;有众多不同的发行版&#xff0c;每个发行版都有其独特的特性和适用场景。本文将聚焦于比较Ubuntu、CentOS、Red Hat和其他系统&#xff0c;深入分析它们的优势、用途以及在不同领域的应用。Linux操作系统的生态系统中&#xff0c;Ubuntu…

SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成&#xff0c;事务具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…

【AI提示词专栏】提示词思维导图帮助

提示词重要作用 提示词&#xff0c;就像是我们生活中的“小助手”或者“贴心小棉袄”&#xff0c;总是在关键时刻给我们提供帮助和指引。它们就像那些无处不在的小标签&#xff0c;时刻提醒我们该做什么、不该做什么&#xff0c;或者给我们一些有趣的启示。 比如&#xff0c;在…