Elasticsearch SQL 详解

news2024/11/27 21:05:54

Elasticsearch SQL 是一个 X-Pack 组件,允许用户使用类似 SQL 的语法在 ES 中进行查询。用户可以在 REST、JDBC、命令行中使用 SQL 在 ES 执行数据检索和数据聚合操作。ES SQL 有以下几个特点:

  • 本地集成,SQL 模块是 ES 自己构建的,直接集成到发布的版本中。
  • 不需要外部的组件,使用 SQL 模块不需要额外的依赖,如硬件、运行时库等。
  • 轻量高效,SQL 模块不抽象 ES 和其搜索能力,而是暴露 SQL 接口,允许以相同的声明性、简洁的方式进行适当的全文搜索。

下面的内容我们基于 ES 7.13 来学习一下 Elasticsearch SQL 模块提供的功能。

如果你对 ES 感兴趣,欢迎订阅我的Elasticsearch 从入门到实践小册,我们一起学习进步!

一、Elasticsearch SQL 使用

在开始使用 SQL 模块提供的功能前,在 kibana 执行以下指令来创建数据:

PUT /library/_bulk?refresh
{"index":{"_id": "Leviathan Wakes"}}
{"name": "Leviathan Wakes", "author": "James S.A. Corey", "release_date": "2011-06-02", "page_count": 561}
{"index":{"_id": "Hyperion"}}
{"name": "Hyperion", "author": "Dan Simmons", "release_date": "1989-05-26", "page_count": 482}
{"index":{"_id": "Dune"}}
{"name": "Dune", "author": "Frank Herbert", "release_date": "1965-06-01", "page_count": 604}

导入数据完成后,可以执行下面的 SQL 进行数据搜索了:

POST /_sql?format=txt
{
  "query": "SELECT * FROM library WHERE release_date < '2000-01-01'"
}

如上实例,使用 _sql 指明使用 SQL模块,在 query 字段中指定要执行的 SQL 语句。使用 format 指定返回数据的格式,数据格式可选项有以下几个,它们都是见名识意的:

formatAccept Http header说明
csvtext/csv逗号分隔
jsonapplication/jsonJson 格式
tsvtext/tab-separated-valuestab 分隔
txttext/plain文本格式
yamlapplication/yamlyaml
cborapplication/cbor简洁的二进制对象表示格式
smileapplication/smile类似于 cbor 的另一种二进制格式

上述 SQL 执行的结果如下:
在这里插入图片描述
更多的返回格式,你可以自己尝试。

除了直接执行 SQL 外,还可以对结果进行过滤,使用 filter 字段在参数中指定过滤条件,可以使用标准的 ES DSL 查询语句过滤 SQL 运行的结果,其实例如下:

POST /_sql?format=txt
{
  "query": "SELECT * FROM library ORDER BY page_count DESC",
  "filter": {
    "range": {
      "page_count": {
        "gte" : 500,
        "lte" : 600
      }
    }
  },
  "fetch_size": 5
}

如上实例,其结果为:

     author     |     name      |  page_count   |      release_date      
----------------+---------------+---------------+------------------------
James S.A. Corey|Leviathan Wakes|561            |2011-06-02T00:00:00.000Z

另外可以使用 ‘?’ 占位符来传递参数,然后将参数和语句组装成完整的 SQL 语句:

POST /_sql?format=txt
{
        "query": "SELECT YEAR(release_date) AS year FROM library WHERE page_count > ? AND author = ? GROUP BY year HAVING COUNT(*) > ?",
        "params": [300, "Frank Herbert", 0]
}

如上示例,使用 ‘?’ 占位符来传递参数。

二、传统 SQL 和 Elasticsearch SQL 概念映射关系

虽然 SQL 和 Elasticsearch 对于数据的组织方式(以及不同的语义)有不同的术语,但本质上它们的用途是相同的。下面是它们的映射关系表:

SQLElasticsearch说明
columnfield在 Elasticsearch 字段时,SQL 将这样的条目调用为 column。注意,在 Elasticsearch,一个字段可以包含同一类型的多个值(本质上是一个列表) ,而在 SQL 中,一个列可以只包含一个表示类型的值。Elasticsearch SQL 将尽最大努力保留 SQL 语义,并根据查询的不同,拒绝那些返回多个值的字段。
rowdocument列和字段本身不存在; 它们是行或文档的一部分。两者的语义略有不同: 行row往往是严格的(并且有更多的强制执行),而文档往往更灵活或更松散(同时仍然具有结构)。
tableindex在 SQL 还是 Elasticsearch 中查询针对的目标
schemaimplicit在关系型数据库中,schema 主要是表的名称空间,通常用作安全边界。Elasticsearch没有为它提供一个等价的概念。

虽然这些概念之间的映射在语义上有些不同,但它们间更多的是有共同点,而不是不同点。

三、SQL Translate API

SQL Translate API 接收 JSON 格式的 SQL 语句,然后将其转换为 ES 的 DSL 查询语句,但是这个语句不会被执行,我们可以可以用这个 API 来将 SQL 翻译到 DSL 语句,其实例如下:

POST /_sql/translate
{
  "query": "SELECT * FROM library ORDER BY page_count DESC",
  "fetch_size": 10
}

如上实例,翻译出来的 DSL 如下:

{
  "size": 10,
  "_source": false,
  "fields": [
    { "field": "author" },
    { "field": "name" },
    { "field": "page_count" },
    {
      "field": "release_date",
      "format": "strict_date_optional_time_nanos"
    }
  ],
  "sort": [
    {
      "page_count": {
        "order": "desc",
        "missing": "_first",
        "unmapped_type": "short"
      }
    }
  ]
}

四、SQL 语法介绍

下面来学习一下 ES 提供的 SQL 语法和语义。

1、词法结构

ES SQL 的词法结构很大程度上类似于 ANSI SQL 本身。ES SQL 当前一次只能接受一个命令,这里的命令是由输入流结尾结束的 token 序列。这些 token 可以是关键字、标识符(带引号或者不带引号)、文本(或者常量)、特殊字符符号(通常是分隔符)。

  1. 关键字
    关键词这个其实跟我们写 SQL 语句那种关键字的定义是一样的,例如 SELECT、FROM 等都是关键字,需要注意的是,关键字不区分大小写。
SELECT * FROM my_table

如上示例,共有 4 个 token:SELECT、 * 、FROM 、my_table,其中 SELECT、 * 、FROM 是关键词,表示在 SQL 具有固定含义的词。而 my_table 是一个标识符,其表示了 SQL 中实体,如表、列等。

可以看到,关键词与标识符都有相同的词汇结构,在 SQL 中长的差不多,有时候难以分辨。ES SQL 支持的关键字有很多这里就不一一列出了,你可以参考官方文档。

  1. 标识符

标识符有两种类型:带引号的和不带引号的,示例如下:

SELECT ip_address FROM "hosts-*"

如上示例,查询中有两个标识符分别为不带引号的 ip_address 和带引号的 hosts-*(通配符模式)。因为 ip_address 不与任何关键字冲突,所以可以不带引号。而 hosts-* 与 - (减号操作)和 * 冲突,所以要加引号。

对于标识符来说,应该尽量避免使用复杂的命名和与关键字冲突的命名,并且在输入的时候使用引号作为标识符,这样可以消除歧义。

  1. 直接常量

ES SQL 支持两种隐式的类型常量:字符串和数字。

  • 字符串,字符串可以用单引号进行限定,例如:‘mysql’。如果在字符串中包含了单引号,则需要使用另一个单引号进行转义,例如:‘Captain EO’‘s Voyage’。
  • 数值常量,数值常量可以使用十进制和科学计数法进行表示,其示例如下:
1969    -- integer notation
3.14    -- decimal notation
.1234   -- decimal notation starting with decimal point
4E5     -- scientific notation (with exponent marker)
1.2e-3  -- scientific notation with decimal point

一个包含小数点的数值常量会被解析为 Double 类型。如果适合解析为整型,则解析为 Integer,否则解析为长整型(Long)。

  1. 单引号、双引号

在 SQL 中,单引号和双引号具有不同的含义,不能互换使用。单引号用于声明字符串,而双引号用于表示标识符。示例如下:

SELECT "first_name" FROM "musicians"  WHERE "last_name"  = 'Carroll'    

如上示例,first_name、musicians、last_name 都是标识符,用双引号。而 Carroll 是字符串,用单引号。

  1. 特殊字符

一些非数字和字母的字符具有不同于运算符的专用含义,特殊字符有:

字符描述
*在一些上下文中表示数据表的所有字段,也可以表示某些聚合函数的参数。
,用于列举列表的元素
.用于数字常量或者分隔标识符限定符(表、列等)
()用于特定的 SQL 命令、函数声明,或者强制优先级。
  1. 运算符

ES SQL 中大多数的运算符它们的优先级都是相同的,并且是左关联。如果需要修改优先级,则要用括号来强制改变其优先级。下表是 ES SQL 支持的运算符和其优先级:

运算符结合性说明
.左结合限定符或者分割符
::左结合PostgreSQL-style 风格的类型转换符
+ -右结合一元加减符
* / %左结合乘法、除法、取模
+ -左结合加法、减法运算
BETWEEN IN LIKE范围包含,字符匹配
< > <= >= = <=> <> !=比较运算
NOT右结合逻辑非
AND左结合逻辑与
OR左结合逻辑或
  1. 注释

ES SQL 支持两种注释:单行和多行注释,其示例如下:

-- single line comment,单行注释

/* multi
   line
   comment
   that supports /* nested comments */
   多行注释
   */

2、SQL 命令

下面来介绍 SQL 的命令。

  1. DESCRIBE TABLE

使用此命令用来查看索引的结构,其语法如下:

DESCRIBE
    [table identifier | 
    [LIKE pattern]]     

第 1 行,可以对关键字 DESCRIBE 进行缩写为 DESC。
第 2 行,单表标识符或者双引号 ES 多索引模式。
第 3 行,SQL Like 匹配模式。

DESCRIBE 命令使用示例如下:

DESCRIBE table;
  1. SELECT

这个其实我们很熟悉了,使用 SELECT 返回需要显示的列,其语法如下:

SELECT [TOP [ count ] ] select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]

在 ES 中使用 SELECT 查询的语法与在数据库中使用基本一致,这里就不做描述了。

  1. SHOW COLUMNS

使用 SHOW COLUMNS 命令可以列出表的所有列和其类型、其他属性,其语法如下:

SHOW COLUMNS [ FROM | IN ]?
    [table identifier | 
    [LIKE pattern] ] 

其使用示例如下:

SHOW COLUMNS IN emp;
SHOW COLUMNS IN emp LIKE 'birth_da%'; // 匹配 birth_da 开头的列
  1. SHOW FUNCTIONS

使用 SHOW FUNCTIONS 可以列出所有 SQL 支持的函数和其类型,LIKE 子句匹配对应的结果,其使语法如下:

SHOW FUNCTIONS [LIKE pattern?]? 

示例如下:

SHOW FUNCTIONS;
SHOW FUNCTIONS LIKE 'ABS'; // 精确匹配
SHOW FUNCTIONS LIKE 'A__'; // 一个 '_' 表示一个字符,所以精确匹配 A + 两个字符,如 AVG、ABS。
SHOW FUNCTIONS LIKE '%DAY%'; // 匹配有 DAY 的函数
  1. SHOW TABLES

我们可以使用 SHOW TABLES 查看所有的表(ES中为索引),其语法如下:

SHOW TABLES
    [INCLUDE FROZEN]?   
    [table identifier | 
    [LIKE pattern ]]?   

简单的实例如下:

SHOW TABLES;
SHOW TABLES "*,-l*"; // 使用 ES multi-target syntax 进行匹配
SHOW TABLES LIKE 'emp'; // 精确匹配
SHOW TABLES LIKE 'emp%'; // 匹配 emp + 多个字符的表
SHOW TABLES LIKE 'em_'; // 匹配 em + 单个字符的表
SHOW TABLES LIKE '%em_'; // 匹配 多个字符 + em + 单个字符的表
  1. 索引模式
    ES SQL 支持两种类型的模式匹配方式类匹配多个索引或者表:多索引模式和 LIKE 模式。
  • 多索引模式
    支持使用通配符 * 或者排他匹配,示例如下:
SHOW TABLES "*,-l*";

多索引模式是通过 ES multi-target syntax 来进行支持的。

  • LIKE 模式
    这个我们就比较熟悉了,上面也很多例子,这里就不在赘述了。

五、ES SQL 使用实践

在使用 SQL 前,我们先准备数据,此处我们将使用 Kibana 提供的航班数据:
在这里插入图片描述

如上图,在 Kibana 中点击左边栏的 Analytics 下的 Overview,弹出的页面中选择 Sample data 的 Tab,然后点击 add data 按钮即可加入航班的数据。

可以使用以下语句查看航班数据的数据结构:

POST /kibana_sample_data_flights/_search
{
  "query": { "match_all": {} }
}

ok,下面来看看常用的 SQL 如何编写。

  1. WHERE

我们过滤出目的地为 US 的数据:

POST /_sql?format=txt
{
  "query": "SELECT FlightNum, OriginWeather, OriginCountry, Carrier FROM kibana_sample_data_flights WHERE DestCountry = 'US'"
}

如上示例,对于用过 SQL 进行数据查询的你来说,肯定不会陌生了,最后其结果为:
在这里插入图片描述

  1. GROUP BY

可以使用 GROUP BY 语句对数据进行分组聚合统计操作,例如查询航班分组的平均飞行距离等。其示例如下:

POST /_sql?format=txt
{
  "query": "SELECT count(*),max(DistanceMiles), avg(DistanceMiles) FROM kibana_sample_data_flights GROUP BY DestCountry"
}

如上示例,我们以目的地国家进行分组,然后统计每个分组的数量、最大的飞行距离,平均飞行距离。其结果如下:
在这里插入图片描述

  1. HAVING

可以使用 HAVING 对分组的数据进行二次筛选,比如筛选分组中记录数大于 100 的数据,其示例如下:

POST /_sql?format=txt
{
  "query": "SELECT count(*),max(DistanceMiles), avg(DistanceMiles) FROM kibana_sample_data_flights GROUP BY DestCountry HAVING COUNT(*) > 100"
}

如上示例,我们过滤出了分组中记录数大于 100 的数据,其结果如下:
在这里插入图片描述

  1. ORDER BY

我们可以使用 ORDER BY 进行排序,例如将平均飞行距离降序排序,其示例如下:

POST /_sql?format=txt
{
  "query": "SELECT count(*),max(DistanceMiles), avg(DistanceMiles) as avgDistance FROM kibana_sample_data_flights GROUP BY DestCountry HAVING COUNT(*) > 100 ORDER BY avgDistance desc"
}

如上示例,我们将数据用平均距离排序,其结果为:
在这里插入图片描述

  1. 分页

分页有多种实现方式,可以使用 limit、top、fetch_size 来进行分页。

1、limit 分页操作

POST /_sql?format=txt
{
  "query": "SELECT FlightNum, OriginWeather, OriginCountry, Carrier FROM kibana_sample_data_flights WHERE DestCountry = 'US' limit 10"
}

2、使用 top 进行分页

POST /_sql?format=txt
{
  "query": "SELECT top 10 FlightNum, OriginWeather, OriginCountry, Carrier FROM kibana_sample_data_flights WHERE DestCountry = 'US'"
}

3、使用 fetch_size 进行分页

POST /_sql?format=txt
{
  "query": "SELECT FlightNum, OriginWeather, OriginCountry, Carrier FROM kibana_sample_data_flights WHERE DestCountry = 'US'",
  "fetch_size": 10
}
  1. 子查询

ES SQL 是可以支持类似于 SELECT X FROM (SELECT * FROM Y) 这样简单的子查询的,其示例如下:

POST /_sql?format=txt
{
  "query": "SELECT avg(data.DistanceMiles) from (SELECT FlightNum, OriginWeather, OriginCountry, Carrier, DistanceMiles FROM kibana_sample_data_flights WHERE DestCountry = 'US') as data"
}

需要注意的是,可能复杂一点的子查询会不被支持。更多的限制可以参考官方文档。

六、总结

本文详细介绍 ES SQL 的相关知识,整的来说,大部分都是基于官方文档进行直译过来的。更多关于 ES SQL 的使用方式,可以参考官方文档。

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

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

相关文章

数据库| 中国研究数据服务平台

数据哪里查&#xff0c;查不到&#xff0c;怎么办&#xff1f; 今天分享一个数据库|中国研究数据服务平台&#xff08;CNRDS&#xff09; 中国研究数据服务平台&#xff08;Chinese Research Data Services&#xff0c;简称CNRDS&#xff09;&#xff0c;是上海经禾信息技术有…

HCIA|详解Telnet协议

一、前言 今天翻到了之前写的Telnet协议的实验&#xff0c;由于该篇文章创作于开始写作的初期&#xff0c;文章结构简单、布局潦草&#xff0c;但实验内容是完整的&#xff0c;因此本篇文章将对Telnet技术进行详解&#xff0c;希望能够对大家提供帮助。在本文中&#xff0c;将从…

ECharts is not Loaded -- echarts里china.json与china.js有何区别

echarts官方提示他们的地图json测绘不符合中国官方标准不提供下载 如下图 china.json china.js 可以很明显的看出地图山东与辽宁部分堆到一起的情况, 接下来换成china.js vue项目&#xff0c;要引入china.js&#xff0c;直接import引入会报错&#xff1a;ECharts is not Loa…

【SCI征稿】IEEE旗下中科院1区(TOP),有关计算机的广泛领域研究

期刊简介&#xff1a; 出版社&#xff1a;IEEE 影响因子&#xff1a;IF&#xff08;2022&#xff09;10.5-11.0 期刊分区&#xff1a;JCR1区&#xff0c;中科院1区&#xff08;TOP&#xff09; 检索情况&#xff1a;SCIE&EI 双检 自引率&#xff1a;13.20% 国人占比&…

在Illustrator中创建 3D 冰淇淋模型对象

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D&#xff0c;你可以前往Envato Elements&#xff0c;在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2&#xff0c;000 个 Illus…

国外广告联盟和国内广告联盟的优劣势是什么

国外广告联盟和国内广告联盟在一些方面存在一些差异和优劣势。以下是对比它们的一些常见优劣势&#xff1a; 一、国外广告联盟优势&#xff1a; 1、国际资源&#xff1a;国外广告联盟拥有更广泛的国际媒体资源&#xff0c;能够帮助广告主拓展全球市场&#xff0c;进一步提高国…

Arduino安装ESP32下载失败的解决方法

Arduino安装ESP32时&#xff0c;经常下载失败 解决办法&#xff1a; 1.复制命令行中的提示信息到记事本&#xff0c;找到下载地址 2.打开浏览器&#xff0c;在地址栏中贴粘下载地址&#xff0c;回车开始下载 3.将下载的包复制到C:\Users\Administrator\AppData\Local\Arduino…

Spring Boot进阶(54):Windows 平台安装 MongoDB数据库 | 超级详细,建议收藏

1. 前言&#x1f525; Windows如何安装MongoDB数据库及使用呢&#xff1f;这将又会是干货满满的一期&#xff0c;全程无尿点不废话只抓重点教&#xff0c;具有非常好的学习效果&#xff0c;拿好小板凳准备就坐&#xff01;希望学习的过程中大家认真听好好学&#xff0c;学习的途…

vue3 电子书 pdf转图片 pdf实现翻页效果 pdfjs-dist、turn.js电子书翻页效果

实现效果&#xff1a; 一、下载插件 // 重点 pdfjs-dist 下载版本有时候 2.16.105 有效 有时候 3.4.120 有效&#xff0c;小编也没搞懂为什么npm install pdfjs-dist3.4.120 //一定要下载 3.4.120 版本的&#xff0c;不然会有报错npm install jquery // 使用的是 turn.js…

【技巧】Maven重复依赖分析查找

【技巧】Maven重复依赖分析查找 遇到奇葩的错误可以考虑是不是依赖冲突了 比如同一段代码 再这个项目中好好的 另一个项目中不能用等 idea安装插件 maven helper 打开pom文件 输入要查找的依赖 将不用的排除掉 右键排除即可

helm 部署 cert-manager 实践

文章目录 1. 介绍2. 架构3. 安装4. 测试5. 删除 1. 介绍 Cert-manager 是一个 Kubernetes 上的证书管理控制器&#xff0c;它可以自动化证书签发和更新的过程。它使用了 Kubernetes 中的 Custom Resource Definitions (CRDs) 来定义证书的请求和颁发&#xff0c;以及与之相关的…

【深度学习】:《PyTorch入门到项目实战》(十六):卷积神经网络:NiN(Network in Network)和1×1卷积(附Pytorch源码)

专栏介绍 ✨本文收录于【深度学习】&#xff1a;《PyTorch入门到项目实战》专栏&#xff0c;此专栏主要记录如何使用PyTorch实现深度学习算法及其项目实战&#xff0c;目前pytorch基础计算已经更新完&#xff0c;正在更新CNN&#xff0c;接下来会陆续更新RNN、CV、NLP、搜推广项…

ceph三个接口的创建

目录 创建 CephFS 文件系统 MDS 接口 服务端操作 客户端操作 创建 Ceph 块存储系统 RBD 接口 1、创建一个名为 rbd-demo 的专门用于 RBD 的存储池 2、将存储池转换为 RBD 模式 ​编辑 3、初始化存储池 4、创建镜像 5、镜像管理 6、Linux客户端使用 客户端使用 RBD …

从MVC跨越到DDD微服务架构是如何演进的

微服务架构演进 领域模型中对象的层次从内到外依次是&#xff1a;值对象、实体、聚合和限界上下文。 实体或值对象的简单变更&#xff0c;一般不会让领域模型和微服务发生大变。但聚合的重组或拆分却可以。因为聚合内业务功能内聚&#xff0c;能独立完成特定业务。那聚合的重组…

嵌入式软件测试笔记12 | 什么是状态转换测试?如何开展?

12 | 什么是状态转换测试&#xff1f;如何开展&#xff1f; 1 状态转换测试简介1.1 基于状态的测试设计技术1.2 系统行为 2 故障类别2.1 状态2.2 防护2.3 转换2.4 事件2.5 其它 3 状态转换测试技术3.1 编写状态-事件表3.2 编写转换树3.3 编写合法测试用例的测试脚本 3.4 编写非…

【100天精通python】Day5:python 基本语句,流程控制语句

目录 1. 条件语句 1.1 if语句 1.2 if-else语句 1.3 if-elif-else语句 2 循环语句 2.1 for循环 2.2 while循环&#xff1a; 3 跳转语句 3.1 break语句 3.2 continue语句 3.3 pass语句 4 异常处理语句&#xff08;try-except语句&#xff09; 5 语句嵌套 5.1 条…

将maven库中没有的jar包导入本地库后编译还提示缺这个jar包

Maven本地仓库有对应的jar包但是报找不到 问题原因 第一&#xff0c;你本地仓库对应的包文件夹下有_remote.repositories这个文件&#xff1b; 第二&#xff0c;你的项目现在连接不到下载这个包的仓库&#xff1b; 以上两点就是本地明明有对应的jar包&#xff0c;但项目中还…

SpringBoot项目中WEB页面放哪里--【SB系列之008】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 SpringBoot项目中WEB页面放哪里–【SB系列之008】 SpringBoot项目中WEB与Controller的联系–【SB系列之009】 ———————————————— 文章目录 SpringBoo…

VulnHub靶机-Socnet

文章目录 实验环境信息收集存活主机探测端口服务探测目录扫描反弹shell建立代理 内网探测漏洞发现漏洞利用 权限提升总结 实验环境 靶机地址&#xff1a; https://www.vulnhub.com/entry/boredhackerblog-social-network,454/靶机ip&#xff1a;192.168.56.101 攻击机&#x…

银河麒麟系统挂载的home文件夹无执行权限

银河麒麟系统挂载的home文件夹里放可执行程序&#xff0c;脚本无法运行&#xff0c;最后修改/etc/fstab文件如下所示就可以了 修改完重启电脑就可以执行可执行程序了