Linux篇(用户管理命令)

news2024/11/16 6:00:09

目录

一、用户与用户组

1. 为什么要做用户与用户组管理

2. Linux的用户及用户组

2.1. Linux的多用户多任务

2.2. 什么是用户

2.3. 什么是用户组

2.4. 用户和用户组的关系

二、用户和用户组管理

1. 用户组管理

1.1. 用户组添加

/etc/group文件结构

1.2. 用户组修改

1.3. 用户组删除

2. 用户管理

2.1. useradd添加用户

2.2. etc/passwd存储用户信息的文件

2.3. id查看用户信息

2.4. usermod修改用户

2.5. passwd修改用户密码

2.6. 认识/etc/shadow文件

2.7. su切换用户

2.8. userdel删除用户


一、用户与用户组

1. 为什么要做用户与用户组管理

用户和用户组管理,就是添加用户和用户组,针对每个用户设置不同的密码

大家平时的笔记本电脑,会设置多个账户吗?为什么?

服务器要添加多账户的作用:

针对不同用户分配不同的权限,不同权限可以限制用户可以访问到的系统资源,提高系统的安全性,

帮助系统管理员对使用系统的用户进行跟踪

2. Linux的用户及用户组

2.1. Linux的多用户多任务

Linux 系统是一个多用户多任务的操作系统

所谓多用户多任务,是指支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响

例如:

小明所在的运维团队一共有四个人,分别有大毛,二毛,三毛,大毛负责网站,

他的账户叫wangzhan, 二毛负责数据库,他的账户叫shujuku

在同一时间,大毛和二毛都可以登录这台服务器,大毛可以查询网站的日志,二毛可以处理数据库的问题,他们之间互不影响

由于我们设置了权限,大毛只能访问网站的日志,无法访问数据库;

二毛可以处理数据库问题,但是不能访问网站的日志。这就实现了我们的多用户多任务的运行机制

2.2. 什么是用户

任何一个运维人员想要登录服务器,都必须先申请一个账号,然后以这个账号的身份进入系统,

就像我们前面说的wangzhan这个账号

每个账号都拥有一个唯一的用户名和各自的密码,

用户在登录时输入正确的用户名和密码后,就能够进入系统,默认会进入到这个用户自己的主目录

2.3. 什么是用户组

用户组是具有相同特征用户的逻辑集合,简单来说,就是具有相同权限的用户的集合

例如:

人事部有20名员工,他们都需要访问一个文件夹,如果我们给这20个用户的账号分别设置权限,这样太麻烦了,

所以我们会建立一个用户组叫HR,对这个组设置权限,将这20个用户加入这个组就可以了!

2.4. 用户和用户组的关系

A :

一个用户可以属于一个用户组,具有此用户组的权限

HR组可以访问/hrfile的文件夹,当user01属于HR组,那么user01就可以访问/hrfile这个文件夹

B :

一个用户可以属于多个用户组,此时具有多个组的共同权限

HR可以访问/hrfile的文件夹,运维可以访问/yunweifile的文件夹,

当user01同时属于HR组和运维组,那么user01可以访问 /hrfile和/yunweifile

**C: **

多个用户可以属于一个用户组,多个用户都具有此用户组的权限

主组

指用户创建时默认所属的组,每个用户的主组只能有一个,创建用户时会同时创建一个和用户名相同的组!

例如:添加用户xiaoming,在建立用户 xiaoming 的同时,就会建立 xiaoming 组作为 xiaoming 用户的初始组

附加组

每个用户只能有一个主组,除主组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组

每个用户的附加组可以有多个,而且用户可以有这些附加组的权限

通常用户和用户组的管理,包含以下工作:

用户组的管理:

用户账号的添加、删除、修改以及用户密码的管理

注意三个文件:

/etc/passwd:用户配置文件,存储用户的基本信息

/etc/group:存储用户组的信息

/etc/shadow:存储用户的密码信息

二、用户和用户组管理

1. 用户组管理

用户组的管理包括用户组的添加、删除和修改

为什么要建立用户组?

前面本人说过,人事部有20名员工,我们要建立一个组,叫 hr,这样就不用分别给20个员工设置权限了

1.1. 用户组添加

命令:groupadd

作用:添加组

语法:# groupadd [参数选项 选项值] 用户组名

选项:-g:设置用户组ID 数字,如果不指定,则默认从1000 之后递增(1-999系统组)

用法一:groupadd 组名
示例代码:
# groupadd hr
含义:新建一个组叫做hr

提示:

linux下我们执行完命令,有时候会没有任何提示,直接回到#提示符,这种状态表明,命令执行成功,没有报错

存储用户组信息的文件:/etc/group

使用cat命令,查看/etc/group文件

cat /etc/group/
/etc/group文件结构
wheel : x : 10 : zhengge
用户组名 : 密码(占位符) : 用户组ID : 组内用户名(附加组)

在 /etc/group 文件中,其一共拥有三个冒号,共四列。

每列含义:

第一列:用户组的组名称

第二列:用户组的组密码,使用一个x占位符

第三列:用户组的组ID编号,1-999代表系统用户组的组编号,1000以后的代表自定义组的组编号

CentOS6 => 1-499,500...

CentOS7 => 1-999,1000...

第四列:用户组内的用户信息(如果一个用户的附属组或附加组为这个组名,则显示在此位置)

特别说明:

1、密码位x代表占位符,用户组可以设置密码,大部分情况下不需要设置

2、组内用户名:表示附加组是该组的用户名称

例如:

wheel组(组ID 10),是 zhengge 账户的附加组,所以 zhengge 这个账户,就显示在这里

若组(组ID 1000),是 zhengge 账户的主组, 即 zhengge 这个账户就不显示在最后

3、wheel组

只有在wheel组中的普通用户,才可以通过su命令切换到root账户,默认所有普通用户都能切换到root,只

要知道root密码!

1.2. 用户组修改

命令:groupmod

语法:# groupmod [选项 选项值] 用户组名

选项:

-g :gid缩写,设置一个自定义的用户组ID 数字

-n :name缩写,设置新的用户组的名称

示例代码:修改hr用户组,将组ID改成1100,将名称改为bjhr

用法一:groupmod -g 新组ID -n 新组名称 原有组名

示例代码:

#groupmod -g 1100 -n bjhr hr

含义:将hr组的组ID改成1100,组名改成bjhr

1.3. 用户组删除

命令:groupdel

语法:# groupdel 用户组名

案例:删除bjhr组

用法一:groupdel 组名

示例代码:

#groupdel bjhr

含义:将bjhr组删除

2. 用户管理

用户的管理涉及用户的添加、删除和修改

与用户相关的文件:/etc/passwd

2.1. useradd添加用户

命令:useradd

作用:添加用户

语法:# useradd [选项 选项的值] … 用户名

选项:

-g:表示指定用户的用户主(主要)组,选项值可以是用户组ID,也可以是组名

-G:表示指定用户的用户附加(额外)组,选项值可以是用户组ID,也可以是组名

-u :uid,用户的id(用户的标识符),系统默认会从500 /或1000之后按顺序分配uid,

如果不想使用系统分配的,可以通过该选项自定义

-c:comment,添加注释(选择是否添加)

-s:指定用户登入后所使用的 shell 解释器,默认/bin/bash【专门的接待员】,如果不想让其登录,则可以设置

为/sbin/nologin

-d:指定用户登入时的启始目录(家目录位置)

-n:取消建立以用户名称为名的群组

当我新建一个账户叫user01, 同时,系统会自动建立一个组也叫user01

用法一:useradd 用户名
示例代码:
#useradd zhangsan
含义:创建用户zhangsan,不带任何选项

注意:不用任何参数,创建用户,系统会默认执行以下操作:

  1. 在 /etc/passwd 文件中创建一行关于zhangsan用户的数据
  2. 在 /etc/shadow 文件中新增了一行关于zhangsan 密码的数据
  3. 在 /etc/group 文件中创建一行与用户名相同的组,例如zhangsan
  4. 在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息,例如zhangsan
  5. 自动创建用户的家目录,默认在/home下,与用户名同名

验证是否成功:

  1. 使用tail文件查看/etc/passwd文件
  2. 使用tail文件查看/etc/group文件
taile -5 /etc/group
  1. 验证是否存在家目录(在Centos 下创建好用户之后随之产生一个同名家目录)
ls /home/

2.2. etc/passwd存储用户信息的文件

使用vim命令打开/etc/passwd文件

vim /etc/passwd

root : x : 0 : 0 : root : /root : /bin/bash
用户名 : 密码 : 用户ID : 用户组ID : 注释 : 家目录 : 解释器shell

用户名:登录linux时使用的用户名

密码:此密码位置一般情况都是"x",表示密码的占位,真实密码存储在/etc/shadow

用户ID:用户的识别符,每个用户都有唯一的UID【-u】

用户组ID:该用户所属的主组ID;【-g】

注释:解释该用户是做什么用的;【-c】

家目录:用户登录进入系统之后默认的位置;【-d】

解释器shell

等待用户进入系统之后,用户输入指令之后,该解释器会收集用户输入的指令,转换成机器语言,传递给内核处

理;

如果解释器是 /bin/bash 表示用户可以登录到系统,/sbin/nologin表示该用户不能登录到系统【-s】

下面我们来看一下对于useradd参数的使用

企业场景1:

公司新员工lisi,属于gzhr部门,用户ID1200,不允许登录系统

创建用户lisi,默认lisi属于自己同名的主组,让lisi 属于附加组gzhr,用户ID 1200,注释为"hruser lisi",解释器为/sbin/nologin

用法二:useradd -G 附加组名 -u 用户ID -s /sbin/nologin -c "shuser lisi" 用户名
示例代码:
#useradd -G gzhr -u 1200 -s /sbin/nologin -c "gzuser lisi" lisi
含义:创建用户lisi,不带任何选项
gzhr行的含义:
    在gzhr的组里(组id 是1002)有一个组内用户lisi(lisi 的附加组就是1002,附加组的名字是gzhr)。
    如果需要为一个用户指定多个附加组,只需要将多个附加组的id 通过英文逗号“,”分割即可。
    例如:-G 500,501,502

    1. 主组必须有且只能有 1 个(类似于只能有一个爹),附加组可以多个,也可以没有附加组(可以认多个干爹)
    2. 后期将权限管理的时候,关于文档的属组指的是主组

2.3. id查看用户信息

命令:id

作用:查看一个用户的一些基本信息(包含用户id,用户组id,附加组id…),该指令如果不指定用户则默认当前用户

语法1:# id 默认显示当前执行该命令的用户的基本信息

id

语法2:# id 用户名, 显示指定用户的基本信息

id zhengge

如何验证以上信息是否正确?

验证用户信息:通过文件/etc/passwd,

cat /etc/passwd

验证用户组信息:通过文件/etc/group

cat /etc/group

2.4. usermod修改用户

命令:usermod(user modify)

语法:# usermod [选项 选项的值] … 用户名

作用:修改用户的各种属性

选项:

-g:表示指定用户的用户主组,选项的值可以是用户组的ID,也可以是组名

-G:表示指定用户的用户附加组,选项的值可以是用户组的ID,也可以是组名

-u:uid,用户的id(用户的标识符),系统默认会从500 之后按顺序分配uid,

如果不想使用系统分配的,可以通过该选项自定义【类似于腾讯QQ 的自选靓号情况】

-L:锁定用户,锁定后用户无法登陆系统lock

-U:解锁用户unlock

-c<备注>:修改用户帐号的备注文字

-d<登入目录>:修改用户登入时的目录

-s:修改用户登入后所使用的shell

企业场景2:

公司员工wangwu,属于shhr部门,现在要休产假,产假期间,暂时停止她登陆电脑的权限,同时原来属于gzhr部门的员工lisi,

负责wangwu的工作,所以,需要把lisi加入到shhr的组,同时,修改lisi的账户注释为“gzhr shhr user”

对于wangwu用户,我们要执行锁定和解锁操作

对于lisi用户,我们要将lisi加入到shhr的附加组,同时修改lisi账户的注释

用法一:usermod -L 王五账户名
示例代码:
#usermod -L wangwu
含义:将王五账户暂时锁定

用法二:usermod -U 王五账户名
示例代码:
#usermod -U wangwu
含义:将王五账户解锁
用法三:usermod -G 组名 -c “注释内容” 李四用户账号
示例代码:
#usermod -G shhr -c "shhr user" lisi
含义:将李四的账户加入shhr组,并修改注释内容为shhr user

2.5. passwd修改用户密码

Linux 不允许没有密码的用户登录到系统,因此前面创建的用户目前都处于锁定状态,需要设置密码之后才能登录计算机

命令:passwd

语法:# passwd 用户名 【如果不指定用户名则修改自己的密码】

作用:修改用户密码

企业场景3:

王五产假休完回到公司上班,需要将王五的账户解锁,在使用usermod -U解锁时,我们看到一个错误信息如下:

usermod: unlocking the user's password would result in a passwordless account.

解锁这个账户,将导致一个没有密码的账户,因为之前王五的账户没有密码

这时候,我们就需要使用passwd命令,给王五的账户设置一个密码

用法一:passwd 账户名
示例代码:
#passwd wangwu
含义:为wangwu账户设置密码
注意:
    当密码过于简单时,系统会提示这是一个不好的密码,因为它太简单了,但是我们仍然可以坚持使用这个密码
    在我们输入密码时,屏幕不会有任何显示。
    密码需要输入两次,请确保两次输入的密码是一样的

示例代码:设置wangwu的用户密码

2.6. 认识/etc/shadow文件

由于 /etc/passwd文件允许所有用户读取,易导致用户密码泄露,

因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了shadow文件中。

/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性

与用户密码相关的文件:/etc/shadow

为用户设置密码之后,会自动在/etc/shadow文件中进行体现,使用vim编辑器打开:

第一列为用户名,例如zhangsan

后面是加密后的密码,就是$开头的字符串

如果显示为!!,则表示这个用户没有设置密码。

由以上截图所知,zhangsan,lisi是没有设置密码的

wangwu我们刚刚设置了密码,所以显示为一个加密的字符串

任务:

新建一个账户叫ityunwei

新建第二个账户叫shichang

给ityunwei账户设置一个密码

进入shadow文件,观察两个账户的区别

2.7. su切换用户

在设置用户密码之后就可以使用此账号进行登录系统了,如果系统处于已登录状态,则可以使用su命令进行切换

用户

为了系统安全,企业中通常不会允许root用户直接登录计算机,但是工作需要,我们又需要使用root权限,

这时候,我们就可以先使用一个普通用户登录计算机,再通过su命令切换到root权限

命令:su

语法:# su [-] 账号

作用:切换用户

用法一:su 用户名
示例代码:
#su root
含义:切换到root权限

注意:
a. 从 root 往普通用户切换不需要密码,但是反之则需要 root 密码;
b. 切换用户之后前后的工作路径是不变的,添加了选项[-]会自动切换到用户的家;
c. 普通用户没有办法访问 root 用户家目录,但是反之则可以;

举例代码:

#查看当前用户
whoami
#发现用户为zhengge
#切换用户到root用户,需要输入密码(root用户切换到普通用户不需要输入密码)
su root

启用wheel组设置:

步骤1:使用vim编辑器 打开/etc/pam.d/su文件

vim /etc/pam.d/su

步骤2:编辑文件,去掉auth required pam_wheel.so use_uid这一行前面的#,使这一行配置生效

步骤3:下面是去掉#后的状态

步骤4:保存退出 :wq

这时,只有在wheel组内的用户才可以su到root

2.8. userdel删除用户

命令:userdel

语法:# userdel 选项 用户名

作用:删除账户及其对应家目录

选项:-r:表示删除用户的同时,删除其家目录/home下的对应文件夹

# userdel -r lisi

# id lisi

注意:

已经登录的wangwu用户删除的时候提示删除失败,但是没有登录的lisi 用户可以正常删除,那这个时候想删除

wangwu怎么办呢?

解决办法:简单粗暴,kill 对应用户的全部进程

ps -ef | grep wangwu

提示:

所有跟用户操作的命令只有root 超级管理员有权限执行

(除passwd 外,只能修改自己的密码,即不指定用户名)

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

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

相关文章

2024-11-15 Element-ui的tab切换中table自适应宽度无法立即100%的问题

前言 今天在写一个统计图表的时候&#xff0c;将所有的table表格和echarts图表放到一个页面中&#xff0c;这样会在纵向上出现滚动条&#xff0c;上下滑动对用户体验不好&#xff0c;于是改成tab切换的形式 遇到的问题 正如标题所述&#xff0c;elementui在tab中使用table时&…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹&#xff1f; 如果觉得博主写的还可以&#xff0c;点赞收藏关注噢~ 第一步&#xff1a;拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后&#xff0c;点击按钮创建…

设计模式-Facade(门面模式)GO语言版本

前言 个人理解Facade模式其实日常生活中已经不知不觉就在使用了&#xff0c;基本核心内容就是暴露一些简单操作的接口&#xff0c;实现上将一些内容封装起来。 如上图&#xff0c;外界使用内部子系统时&#xff0c;只需要通过调用facade接口层面的功能&#xff0c;不需要了解子…

【隐私计算】隐私计算的应用场景探索(大模型隐私计算、隐私数据存储计算、Web3、隐私物联网等)

1. 背景分析 隐私计算作为一种实现“原始数据不出域&#xff0c;可用不可见”的数据流通价值的关键技术&#xff0c;经历了2020-2023年的高光时刻&#xff0c;却在2024年骤然走向低谷。从各种渠道了解到一些业内曾经风光无两的隐私计算公司都有不同程度的裁员。几乎一夜之间&am…

【提高篇】3.4 GPIO(四,工作模式详解 下)

四,模拟输入输出 上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。该模式用于 ADC 采集或者 DAC 输出,或者低功耗下省电。但要注意的是 GPIO本身并不具备模拟输出输入的功能。 4.1 模拟输入 STM32内置ADC(模数转换器),可以将模拟信号转换为数字信号。GPIO引脚可以…

【青牛科技】D4147漏电保护电路介绍及应用

1、标题&#xff1a; D4147漏电保护电路 2、简介&#xff1a; 我司代理电源管理芯片&#xff0c;产品具有失效率低、可靠性高等特点。 3、具体应用&#xff1a; 相关产品介绍&#xff1a; 4、D4147 应用框图&#xff1a; D4147 方案介绍&#xff1a; 接地零线故障引起的接地…

【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 引言&#x1f4cc; 1. 为什么 list 容器需要 list_iterator…

MuMu模拟器安卓12安装Xposed 框架

MuMu模拟器安卓12安装Xposed 框架 当开启代理后,客户端会对代理服务器证书与自身内置证书展开检测,只要检测出两者存在不一致的情况,客户端就会拒绝连接。正是这个原因,才致使我们既没有网络,又抓不到数据包。 解决方式: 通过xposed框架和trustmealready禁掉app里面校验…

MongoDB分布式集群搭建----副本集----PSS/PSA

MongoDB分布式集群 Replication 复制、Replica Set 复制集/副本集 概念 一、 副本集的相关概念 1.概念 “ A replica set is a group of mongod instances that maintain the same data set. ” 一组MongoDB服务器&#xff08;多个mongod实例&#xff09;&#xff08;有不…

Java篇String类的常见方法

目录 一. String类的概念 1.1 String类的特性 二. 字符串的构造方式 三. 常用方法 3.1 字符串查找 3.2 字符串转换 3.3 字符串比较 3.3.1 equals( )方法 3.3.2 compare To( )方法 3.3.3 compare ToIgnoreCase( )方法 3.4 字符串替换 3.4.1 replace( )方法 3.4.2 r…

「QT」文件类 之 QDataStream 数据流类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

MySQL45讲 第二十三讲 是怎么保证数据不丢的?

文章目录 MySQL45讲 第二十三讲 是怎么保证数据不丢的&#xff1f;一、binlog 写入机制&#xff08;一&#xff09;事务执行与 binlog cache&#xff08;二&#xff09;事务提交与 binlog 文件写入 二、redo log 写入机制&#xff08;一&#xff09;事务执行与 redo log buffer…

pgaudit插件-pgslq

使用pgaudit插件 一.介绍 postgresql可以通过log_statementall 提供日志审计&#xff0c;但是无法详细的提供日志信息&#xff0c;使用ogaudit能够提供详细的会话和对象审计日志&#xff0c;是PG的一个扩展插件 注意&#xff1a;pgAudit可能会生成大量日志。请谨慎确定要在您…

系统掌握大语言模型提示词 - 从理论到实践

以下是我目前的一些主要个人标签&#xff1a; 6 年多头部大厂软件开发经验&#xff1b;1 年多 AI 业务应用经验&#xff0c;拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI&#xff0c;已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件

Vue 项目打包后环境变量丢失问题&#xff08;清除缓存&#xff09;&#xff0c;区分.env和.env.*文件 问题背景 今天在导报项目的时候遇到一个问题问题&#xff1a;在开发环境中一切正常&#xff0c;但在打包后的生产环境中&#xff0c;某些环境变量&#xff08;如 VUE_APP_B…

群控系统服务端开发模式-应用开发-前端菜单功能开发

今天优先开发菜单及角色&#xff0c;明天将开发岗位配置、级别配置等功能。具体看下图 而前端的路由不需要手动添加&#xff0c;是依据数据库里面存储的路径。 一、添加视图 在根目录下src文件夹下views文件夹下permission文件夹下menu文件夹下&#xff0c;新建index.vue&…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…

【HarmonyOS学习日志(8)】UIAbility,HAP,AbilityStage组件及其生命周期

基本概念 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 在项目创建时&#xff0c;系统默认生成的EntryAbility类继承了UIAbility类。 ExtensionAbility组件&#xff1a;是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件…

【Linux】多线程(中)

目录 一、线程互斥 1.1 互斥概念 1.2 互斥量mutex 1.3 互斥量相关API &#xff08;1&#xff09;初始化互斥量 &#xff08;2&#xff09;销毁互斥量 &#xff08;3&#xff09;互斥量加锁和解锁 1.4 互斥量原理 1.5 重入和线程安全 二、死锁 2.1 概念 2.2 造成死锁…

【数字图像处理+MATLAB】基于 Sobel 算子计算图像梯度并进行边缘增强:使用 imgradientxy 函数

引言 在图像处理中&#xff0c;边缘通常是图像中像素强度变化最大的地方&#xff0c;这种变化可以通过计算图像的梯度来量化。梯度是一个向量&#xff0c;它的方向指向像素强度增加最快的方向&#xff0c;它的大小&#xff08;或者说幅度&#xff09;表示像素强度增加的速度。…