Linux - Shell 以及 权限问题

news2024/11/18 10:41:59

目录

Shell的运行原理

Linux权限问题

  Linux权限的概念

        如何实现用户账号之间的切换

        如何仅提升当前指令的权限

        如何将普通用户添加到信任列表

  Linux权限管理

        文件访问者的分类(人)

        文件类型和访问权限(事物属性)

        文件权限值的表示方法

        文件访问权限的相关设置方法

          如何改变文件的访问权限

          如何改变文件的拥有者

          如何改变文件的所属组

          如何修改文件的掩码

  目录的权限

  粘滞位


Shell的运行原理

        无论是Windows的图形化界面还是Linux的命令行界面,它们本质上都是操作系统提供给用户的交互方式,通常被称为“外壳程序”或者“壳层(shell)”。

        图形化界面(GUI)通过图标、菜单和窗口等可视化元素来让用户进行操作,这种方式直观、易用,特别适合那些不熟悉命令行操作的用户。

        而命令行界面(CLI)则是通过命令输入和文本界面来完成操作,它可以提供更为精确和灵活的控制,尤其对于需要自动化任务或者远程管理系统的操作来说尤为重要。

Linux严格来说是一个操作系统的核心,也就是kernel,而不是整个操作系统。用户无法直接与kernel交互,而是通过Shell这样的外壳程序来与kernel进行通信和操作。

Shell被称为命令行解释器,其主要功能包括:

  1. 解释和执行命令: 用户输入的命令通过Shell解释器被翻译成kernel可以理解的形式,并且传递给kernel执行。

  2. 返回结果给用户: Shell将kernel执行命令的结果再翻译成用户可以理解的形式,然后输出给用户。

        Shell不仅限于命令行界面,还包括图形界面下的命令解释器。它提供了用户与Linux操作系统交互的主要方式,使用户能够通过命令和脚本完成各种操作,从简单的文件管理到复杂的系统配置和管理工作。

在Linux系统中,Shell的运行原理可以概括为以下几个关键步骤:

  1. 创建子进程: 当用户在Shell中输入命令时,Shell首先会创建一个子进程。这个子进程负责执行用户输入的命令。

  2. 命令行解释: 子进程会将用户输入的命令进行解释和执行。这个过程包括解析命令的语法和语义,确定命令需要执行的操作,以及调用系统调用与内核交互来实现具体功能。

  3. 执行命令: 子进程根据解释后的命令,执行相应的操作。这可以包括文件操作、进程管理、系统配置等多种任务,具体操作由命令的内容和参数决定。

  4. 错误处理: 如果子进程在执行过程中出现问题(如命令不存在、权限不足等),它会返回相应的错误码或者错误信息。这些错误不会影响父进程(即Shell本身)的正常运行。

  5. 结果返回给用户: 子进程执行完命令后,将结果输出到标准输出(stdout)。Shell会接收并处理这些输出,最终将结果显示给用户。

  6. 等待命令输入: 子进程完成命令执行后,会终止并退出,回到Shell的环境中等待下一个用户命令的输入。Shell本身则持续运行,等待用户的下一个操作。

        用户在Windows中运行的应用程序,如QQ、微信等,都是通过创建单独的进程来实现的。如果一个程序出现问题,如卡死或崩溃,其他程序仍然可以正常运行,保证了系统的稳定性和用户体验。 

Linux权限问题

  Linux权限的概念

        在Linux系统中,权限管理是非常重要的安全措施,通过权限可以控制用户对系统资源的访问和操作。

  • 超级用户(root)权限:

    • 完全访问权: 超级用户(root)在Linux系统中拥有完全的访问权力。这意味着root用户可以执行任何操作,包括创建、修改、删除系统文件和目录,安装软件包,配置系统设置等等,几乎没有任何限制。
    • 风险和谨慎: 因为root用户的权限如此广泛,所以使用root权限时需要特别小心,确保不会意外或不正确地更改系统设置或文件,从而导致系统不稳定或不安全。
    • 超级用户的命令提示符是“#”。
  • 普通用户权限:

    • 有限的权限: 普通用户在Linux系统中的权限相对受到限制。普通用户一般只能在自己的主目录(通常是/home/username)中进行操作,包括创建、修改、删除自己的文件和目录。
    • 系统范围内的限制: 普通用户通常不能修改系统级别的配置文件或执行系统管理任务,如安装软件到系统级别、修改系统广域网配置等。这种限制可以有效地防止用户误操作或者恶意操作对系统造成损害。
    • 普通用户的命令提示符是“$”。

        如何实现用户账号之间的切换

        可能有时你的权限不够,需要从普通用户切换到超级用户,进而完成某些操作。

语法: su 用户名
功能: 用户切换。
从普通账号切换为root账号。

        从普通账号切换为root账号。

        从root账号切换为普通账号。

注意:
        1)从普通账号切换为root账号时,指令当中的root可省略,因为root账号只有一个。
        2)该指令也可以从一个普通用户切换为另一个普通用户,输入待切换用户的账号密码即可。
        3)切换用户后,若想切回上次的用户,可通过Ctrl+D实现。 

        如何仅提升当前指令的权限

        但可能某些情况下,你只想提升当前指令的权限,那么不必切换到超级用户。   

语法: sudo 指令
功能: 提升当前指令的权限。      

        如何将普通用户添加到信任列表

登录超级用户(root)

        首先,确保你已经登录为拥有管理员权限的超级用户(root账户),或者具有可以使用sudo的账户。

修改sudo配置

        在终端中,编辑sudo配置文件,通常是/etc/sudoers文件。不要直接编辑此文件,而是使用visudo命令,这个命令会在保存时检查语法错误,确保文件不会损坏。

sudo visudo

添加用户到sudo组

        在sudoers文件中,找到如下行:

## Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

        下面添加一行,将普通用户加入到sudo用户组:

bob  my current through only from such If

  Linux权限管理

        文件访问者的分类(人)

        文件访问权限通常分为三个类别,用于确定哪些用户可以访问文件以及如何访问。

这些类别如下:

  1. 文件所有者(Owner):

    • 文件所有者是创建文件或目录的用户。对于每个文件或目录,只有一个用户可以是所有者。
    • 所有者可以通过设置权限来控制文件的读取、写入和执行权限,以及文件的组分配。
  2. 文件所属组(Group):

    • 每个文件或目录都关联一个所属组,该组是文件所有者所在的用户组。多个用户可以属于同一个组。
    • 文件所属组可以通过设置权限来控制该组内的用户对文件或目录的读取、写入和执行权限。
  3. 其他用户(Others):

    • 其他用户是所有不是文件所有者,也不属于文件所属组的用户。
    • 其他用户可以通过设置权限来控制所有其他用户对文件或目录的读取、写入和执行权限。

注意:
        1)对于某一文件而言,其拥有者、所属组和other就是由超级用户(root)和普通用户所扮演。
        2)在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。 

        那么为什么会有所属组这个概念呢? 下面举个例子。

        在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),而你就是A组当中的一员。

        所属组的存在使得文件创建者可以灵活地设置权限,使自己和团队成员能够访问文件,同时限制其他人的访问权限。 

        我们可以通过指令ll来查看某一文件或文件目录的拥有者和所属组。

        文件类型和访问权限(事物属性)

        权限涉及到某个具体的事物来说,我们还需要讨论事物本身的属性。对于文件来说,我们应该讨论其文件类型,以及是否具有可读、可写和可执行的属性。

        使用指令ll,我们可以看到前面有一串字符,这串字符实际上就代表着该文件的类型和属性。 

        这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型。 

不同的字符代表不同的文件类型。
        1)-:代表普通文件。
        2)d:代表目录。
        3)l:代表链接文件(类似于Windows当中的快捷方式)。
        4)b:代表块设备文件(例如硬盘、光驱等)。
        5)p:管道文件。
        6)c:字符设备文件。
        7)s:套接口文件。 

注意:在Linux中,文件类型是由文件系统和文件的属性来决定的,而不是由文件名或文件扩展名(后缀)来决定的。这与Windows等操作系统有所不同,因为Windows通常根据文件扩展名来确定文件类型。但是我们仍然推荐使用后缀,方便我们人区分以及一些工具需要。 

        剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性。

        每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。

        若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性。

        文件权限值的表示方法

        在Linux中,文件权限可以使用两种主要的表示方法:字符表示法和八进制数值表示法。

 1)字符表示方法
        ll指令打印文件权限值时的表示方法就是字符表示法。

字符表示法说明
r - -仅可读
- w -仅可写
- - x仅可执行
r w -可读可写
r - x可读可执行
- w x可写可执行
r w x可读可写可执行
- - -无权限

2)八进制数值表示法
        字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。 

字符表示法二进制八进制数值表示法说明
r - -1004仅可读
- w -0102仅可写
- - x0011仅可执行
r w -1106可读可写
r - x1015可读可执行
- w x0113可写可执行
r w x1117可读可写可执行
- - -0000无权限

        文件访问权限的相关设置方法

          如何改变文件的访问权限

        要改变文件的访问权限,你可以使用 chmod 命令,并根据你的需求选择合适的权限设置方式:符号表示法或八进制数字表示法。

使用符号表示法设置权限

        符号表示法允许你根据用户、所属组和其他用户分别设置权限,并可以一次性设置多个权限。 

语法:

chmod [选项] 拥有者符号权限,所属组符号权限,其他用户符号权限 文件名或目录名

常用选项:

        -R:递归修改目录及其子目录下所有文件的权限。
符号含义:

        +:添加权限。
        -:移除权限。
        =:设置精确权限。
用户符号:

        u:文件拥有者(用户)。
        g:文件所属组。
        o:其他用户。
        a:所有用户(等同于 u,g,o 的组合)。
权限字符:

        r:读取权限。
        w:写入权限。
        x:执行权限。

# 设置文件拥有者具有读写权限,所属组具有读权限,其他用户无权限
chmod u=rw,g=r,o= file.txt

# 添加文件拥有者的执行权限
chmod u+x file.sh

# 移除其他用户的写入权限
chmod o-w file.txt

# 递归设置目录及其下所有文件为所有用户只读权限
chmod -R a=r directory/

使用八进制数字表示法设置权限
        八进制数字表示法将权限转换为一个三位数的八进制数,每个位上的数字对应于 rwx 的权限组合。

语法:

chmod [选项] 八进制权限值 文件名或目录名

八进制数值:

        r:读取权限对应值为 4。
        w:写入权限对应值为 2。
        x:执行权限对应值为 1。

# 设置文件拥有者读写执行权限,所属组读执行权限,其他用户只读权限
chmod 751 file.sh

# 递归设置目录及其下所有文件为所有用户读写执行权限
chmod -R 777 directory/

注意事项:

  • 使用 chmod 命令需要有足够的权限来修改文件或目录的权限。
  • 使用 -R 选项要小心,确保只在需要递归设置权限时使用,以免意外修改到不必要的文件和目录。
  • 使用符号表示法和八进制数字表示法,根据具体的需求和习惯选择合适的方式来设置文件的访问权限。
          如何改变文件的拥有者

        要改变文件或目录的拥有者,你可以使用 chown 命令。这个命令允许你指定新的用户或用户组作为文件或目录的拥有者。

语法:

chown [选项] 用户名:组名 文件名或目录名

常用选项:

        -R:递归地修改目录及其子目录下所有文件的拥有者。
说明:

        用户名:新的文件或目录拥有者的用户名。
        组名:新的文件或目录所属组的组名(可选)。

示例:
1、修改文件的拥有者:

chown bob file.txt

        这个命令将 file.txt 文件的拥有者修改为 bob 用户。

2、修改目录的拥有者及其子目录下所有文件的拥有者(递归修改):

chown -R alice:users directory/

        这个命令将 directory/ 目录及其所有子目录和文件的拥有者修改为 alice 用户,并将它们所属的组设置为 users 组。

 注意事项:

  • 使用 chown 命令需要有足够的权限来修改文件或目录的拥有者。
  • 使用 -R 选项要小心,确保只在需要递归修改拥有者时使用,以免意外修改到不必要的文件和目录。
          如何改变文件的所属组

        要改变文件或目录的所属组,你可以使用 chgrp 命令。这个命令允许你指定新的用户组作为文件或目录的所属组。

语法:

chgrp [选项] 组名 文件名或目录名

常用选项:

        -R:递归地修改目录及其子目录下所有文件的所属组。
说明:

        组名:新的文件或目录所属的组名。

 示例:
1、修改文件的所属组:

chgrp users file.txt

        这个命令将 file.txt 文件的所属组修改为 users 组。

2、修改目录的所属组及其子目录下所有文件的所属组(递归修改):

chgrp -R developers directory/

        这个命令将 directory/ 目录及其所有子目录和文件的所属组修改为 developers 组。

注意事项:

  • 使用 chgrp 命令需要有足够的权限来修改文件或目录的所属组。
  • 使用 -R 选项要小心,确保只在需要递归修改所属组时使用,以免意外修改到不必要的文件和目录。
          如何修改文件的掩码

        我们查看新建的文件和目录,它们都有自己默认的权限。

        实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法。

        但实际上你会发现,你所创建出来的文件和目录的权限值往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask) 

语法: umask 权限值
功能: 查看或修改文件掩码。

        我们可以通过指令umask查看文件默认掩码。

        因此我们实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出。首先我们将掩码的的后三位八进制换算为二进制,然后对其进行按位取反。

        然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值。

         也可以理解为凡是在umask中出现的权限位,都不能在最终权限中出现。

        我们也可以通过修改umask来设置文件的访问权限。

注意: 超级用户的默认掩码为0022,普通用户的默认掩码为0002。 

  目录的权限

        对于目录来说,与文件不同,其权限具有特定的含义和影响:

  1. 可读权限 (r)

    • 如果用户对目录具有可读权限,那么用户可以通过 ls 命令列出该目录中的文件和子目录名字。
    • 可读权限也允许用户使用 stat 命令查看目录的详细属性信息。
  2. 可写权限 (w)

    • 如果用户对目录具有可写权限,那么用户可以在该目录中创建新文件、删除已存在的文件或目录,以及对已有文件或目录进行重命名。
    • 可写权限还允许用户修改目录下文件和子目录的内容,包括修改文件的内容或属性。
  3. 可执行权限 (x)

    • 如果用户对目录具有可执行权限,那么用户可以通过 cd 命令进入该目录。
    • 可执行权限还允许用户使用目录下文件的绝对路径,例如执行脚本文件或读取文件的内容,但仅限于有权限的文件。

总结:

  • 可读权限 (r): 允许列出目录中的内容和查看目录的属性。
  • 可写权限 (w): 允许在目录中创建、删除和修改文件或目录。
  • 可执行权限 (x): 允许用户进入目录并执行目录下文件的操作,例如读取文件内容或执行文件。

那么这就会出现一个问题:
        只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。 

        为了解决这个不合理的问题,Linux引入了粘滞位的概念。

  粘滞位

语法: chmod +t 目录名
功能: 给目录加上粘滞位。

        当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。

        此时另一个用户就算有该目录的所有权限,也无法删除该目录下的文件。

        粘滞位应用于目录时,其主要作用是限制文件的删除权限。具体来说,如果一个目录被设置了粘滞位,则只有以下用户可以删除该目录中的文件:

  1. 超级用户:即root用户,始终具有最高权限,可以删除目录中的任何文件。

  2. 目录的拥有者:拥有该目录的用户,可以删除该目录中的任何文件,无论文件的权限设置如何。

  3. 文件的拥有者:即文件创建者,可以删除自己创建的文件,即使其他用户有写入权限。

注意事项:

  • 设置粘滞位只影响目录中的文件删除操作,不影响文件的创建或修改。
  • 粘滞位不会影响目录拥有者或文件拥有者的写入权限。
  • 粘滞位通常用于公共目录或者共享目录,以防止用户意外或恶意删除其他用户的文件。

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

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

相关文章

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——模型部分浅析(1)

【GeoTransformer系列】——模型部分 1. create_model2. model的本质3. 模型的主要结构3.1 backbone3.2 transformer本篇继续对GeoTransformer/experiments/geotransformer.kitti.stage5.gse.k3.max.oacl.stage2.sinkhorn/下面的trainval.py进行详细的解读,主要是模型部分, 可以…

一款针对Webpack等前端打包工具所构造的网站进行快速、高效安全检测的扫描工具

免责声明 由于传播、利用本公众号夜组安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号夜组安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除…

硅纪元视角 | 法国8人团队发布Moshi,挑战OpenAI的开源实时多模态模型!

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

51单片机-让一个LED灯闪烁、流水灯(涉及:自定义单片机的延迟时间)

目录 设置单片机的延迟(睡眠)函数查看单片机的时钟频率设置系统频率、定时长度、指令集 完整代码生成HEX文件下载HEX文件到单片机流水灯代码 (自定义延迟时间) 设置单片机的延迟(睡眠)函数 查看单片机的时钟频率 检测前单片机必…

红海云签约海新域集团,产业服务运营领军企业加速人力资源数字化转型

北京海新域城市更新集团有限公司(以下简称“海新域集团”)是北京市海淀国有资产投资集团有限公司一级监管企业,致力于成为国内领先的产业服务运营商。集团积极探索城市和产业升级新模式,通过对老旧、低效等空间载体重新定位规划、…

【Python】成功解决TypeError: iteration over a 0-d tensor

【🐍Python】成功解决TypeError: iteration over a 0-d tensor 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介&#xf…

赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!

简介 websocket在前端开发中,是一个必须掌握的技术!你可以不用,但必须掌握! 前几天,就遇到这样一个需求,要求界面的数据通过websocket实时推送,并且必须支持断网重连、自动心跳! 自动心跳是定期向服务端发送小型数据包,如果一段时间内服务端没有收到心跳响应,系统可…

大模型LLMs概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题:Large Language Models for Generative Information Extraction: A Survey 论文链接:https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型(LLMs)在生成式信息抽取(IE)任务中的应用…

1.1.2数据结构的三要素

一.数据结构的三要素 数据结构这门课着重关注的是数据元素之间的关系,和对这些数据元素的操作,而不关心具体的数据项内容 。 1.逻辑结构 (1)集合结构 (2)线性结构 数据元素之间是一对一的关系。除了第一个…

【C语言】return 关键字

在C语言中,return是一个关键字,用于从函数中返回值或者结束函数的执行。它是函数的重要组成部分,负责将函数的计算结果返回给调用者,并可以提前终止函数的执行。 主要用途和原理: 返回值给调用者: 当函数执…

AI绘画Stable Diffusion画全身图总是人脸扭曲?ADetailer插件实现一键解决!

大家好,我是向阳 你是否遇到过SD生成的人物脸部扭曲、甚至令人恶心的情况?也曾感到束手无策?别担心,这份教程专为你而来。 在使用SD生成人物全身照时,你可能经常发现人物的脸部会出现扭曲问题。这是因为人物面部像素…

TP8/6 更改后台入口地址admin改为myadmin 隐藏真实后台网址

原来www.xxx.com/admin 改后www.xxx.com/myadmin config/app.php // 应用映射(自动多应用模式有效)app_map > [admintest>admin], 官方文档:ThinkPHP官方手册

免费申请 HTTPS 证书的八大方法

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 为了保证网站的安全和数据的隐私性,使用 HTTPS 加密协议已成为必需。HTTPS 证书由受信任的证书颁发机构 (CA) 签发,可以加密客户端和服务器之间的通信。 幸运的是,有许多方法可以免费申请 HTTPS 证书。本文将介绍八种方法…

云仓酒庄天津分公司:深化业务常态化运营

标题:云仓酒庄天津分公司:深化业务常态化运营,以沙龙为纽带,构建价值叠加的酒业新生态 在当今复杂多变的经济环境中,传统酒业面临着前所未有的挑战与机遇。随着数字化转型的加速和消费者偏好的日益多元化,…

springcloud+vue项目,controller层接口返回json数据,前端可以接收到数据,但浏览器“F12-->网络-->响应“显示为空的问题处理

1.显示为空的场景 SharetekR(access_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJQQzoxODA1ODA4ODc1MjUwMTIyNzUyIiwicm5TdHIiOiJrZEoxV05CV3NBSUdYb05TbktSU3kzOGNuSnk3c3FRTSIsInVzZXJJZCI6MTgwNTgwODg3NTI1MDEyMjc1MiwidXNlck5h…

【Python】九种数据类型详讲(内含常见常见的字符串函数汇总)

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言Number(数字)整数类型int (整型,长整型)float(浮点型)complex(复数)…

从硬件角度看Linux的内存管理

1. 分页机制 分段机制的地址映射颗粒度太大,以整个进程地址空间为单位的分配方式导致内存利用率不高。 分页机制把这个分配机制的单位继续细化为固定大小的页(Page),进程的虚拟地址空间也按照页来分割,这样常用的数据和代码就可以以页为单位…

赛灵思的乘法器IP核的blocking mode

一、文档中的解释 我以为乘法器使用blocking mode的输入buffer很大,结果如下图,FFT的buffer就buffer了一个时钟周期,接下来就是只能用一个fifo,35个时钟周期之后,再把值给到乘法器了,然后把乘法器可以改回到…

FPC生产工艺全流程详解

FPC生产制作繁琐而且难度较大,与普通PCB比较,FPC单位面积电路的造价高很多,但是,由于FPC优异的柔性、轻薄和可靠性等特性,给众多领域的设备和产品提供了更广泛的实现空间和新的设计方案,比如沉金板在电子、…

windows server2016搭建AD域服务器

文章目录 一、背景二、搭建AD域服务器步骤三、生成可供java程序使用的keystore文件四、导出某用户的keytab文件本人其他相关文章链接 一、背景 亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干…