如何使用外部脚本运行_update elasticsearch

 你是谁你要知道_893 发布于 2022-12-28 13:57

我想运行示例更新

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.text = \"some text\""
}'

(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html),但收到了错误{"error":"ElasticsearchIllegalArgumentException[failed to execute script]; nested: ScriptException[dynamic scripting for [mvel] disabled]; ","status":400}.

从这个页面http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html,我发现我需要放置我的脚本(我称之为demorun.groovy)并按名称运行它.我做到了,现在尝试引用为

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "demorun.groovy"
}'

但仍然得到相同的错误.我想这是错误的.如何使用外部脚本传递_update?

我的demorun.groovy:

ctx._source.text = \"some text\"

John Petrone.. 11

您收到的错误消息表示禁用了动态脚本,这是默认设置.您需要启用脚本才能工作:

启用动态脚本

我们建议在应用程序或代理后面运行Elasticsearch,以保护Elasticsearch免受外界影响.如果允许用户运行动态脚本(即使在搜索请求中),则他们对运行Elasticsearch的用户具有相同的访问权限.因此,默认情况下,仅允许沙盒语言使用动态脚本.

首先,您不应该以root用户身份运行Elasticsearch,因为这将允许脚本在您的服务器上访问或执行任何操作,而不受任何限制.其次,您不应将Elasticsearch直接暴露给用户,而应在其间具有代理应用程序.如果您打算直接向用户公开Elasticsearch,那么您必须决定是否信任它们以便在您的盒子上运行脚本.如果这样做,您可以通过将以下设置添加到每个节点上的config/elasticsearch.yml文件来启用动态脚本:

script.disable_dynamic:false

虽然这仍然允许执行配置中提供的命名脚本,或通过插件注册的本机Java脚本,但它也允许用户通过API运行任意脚本.而不是将文件的名称作为脚本发送,而是可以发送脚本的主体.

script.disable_dynamic设置有三种可能的配置值,默认值为sandbox:

true:禁用所有动态脚本,脚本必须放在config/scripts目录中.

false:启用所有动态脚本,脚本可以作为请求中的字符串发送.

sandbox:脚本可以作为沙盒语言的字符串发送.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html

1 个回答
  • 您收到的错误消息表示禁用了动态脚本,这是默认设置.您需要启用脚本才能工作:

    启用动态脚本

    我们建议在应用程序或代理后面运行Elasticsearch,以保护Elasticsearch免受外界影响.如果允许用户运行动态脚本(即使在搜索请求中),则他们对运行Elasticsearch的用户具有相同的访问权限.因此,默认情况下,仅允许沙盒语言使用动态脚本.

    首先,您不应该以root用户身份运行Elasticsearch,因为这将允许脚本在您的服务器上访问或执行任何操作,而不受任何限制.其次,您不应将Elasticsearch直接暴露给用户,而应在其间具有代理应用程序.如果您打算直接向用户公开Elasticsearch,那么您必须决定是否信任它们以便在您的盒子上运行脚本.如果这样做,您可以通过将以下设置添加到每个节点上的config/elasticsearch.yml文件来启用动态脚本:

    script.disable_dynamic:false

    虽然这仍然允许执行配置中提供的命名脚本,或通过插件注册的本机Java脚本,但它也允许用户通过API运行任意脚本.而不是将文件的名称作为脚本发送,而是可以发送脚本的主体.

    script.disable_dynamic设置有三种可能的配置值,默认值为sandbox:

    true:禁用所有动态脚本,脚本必须放在config/scripts目录中.

    false:启用所有动态脚本,脚本可以作为请求中的字符串发送.

    sandbox:脚本可以作为沙盒语言的字符串发送.

    http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html

    2022-12-28 14:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有