[comment]: # translation:outdated

[comment]: # ({542796d3-542796d3})
# 8 脚本

[comment]: # ({/542796d3-542796d3})

[comment]: # ({e0ec1ae1-58923c7d})
#### 概述

在*管理 → 脚本*部分可以配置和维护用户定义的全局脚本。

根据配置的作用域和用户权限，全局脚本可用于以下场景执行：

- 从[主机菜单](/manual/web_interface/frontend_sections/monitoring/dashboard#主机菜单)
  在多个前端位置执行（*仪表盘*、*问题*、*最新数据*、*地图*等）
- 从[事件菜单](/manual/web_interface/frontend_sections/monitoring/problems#事件菜单)执行
- 可作为run操作在动作中执行

脚本将在Zabbix agent、Zabbix server（proxy）或仅Zabbix server上执行。另见[Command
execution](/manual/appendix/command_execution)。

在Zabbix agent和Zabbix proxy上，默认禁用远程脚本。可通过以下方式启用：

- 对于在Zabbix agent执行的远程命令
  - 在agent配置中为每个允许的命令添加AllowKey=system.run[<command>,\*]参数，\*代表wait和nowait模式。
- 对于在Zabbix proxy执行的远程命令
  - **警告：如果远程命令在由Zabbix proxy监控的Zabbix agent上执行，则无需在Zabbix proxy上启用远程命令。**但如果确实需要在Zabbix proxy上execute远程命令，
    请在proxy配置中将*EnableRemoteCommands*参数设为'1'。

    

显示现有脚本及其详细信息的列表。

![](../../../../../assets/en/manual/web_interface/scripts.png){width="600"}

显示的数据：

| 列 | 描述 |
|--|--------|
| *Name* | 脚本名称。点击脚本名称可打开脚本[配置全局脚本](scripts#配置全局脚本)。 |
| *Scope* | 脚本作用域 - 动作操作、手动主机操作或手动事件操作。该设置决定脚本的可用位置。 |
| *Used in actions* | 显示使用该脚本的动作。 |
| *Type* | 显示脚本类型 - *Webhook*、*Script*、*SSH*、*Telnet*或*IPMI*命令。 |
| *Execute on* | 显示脚本将在Zabbix agent、Zabbix server（proxy）或仅Zabbix server上执行。 |
| *Commands* | 显示脚本中要执行的所有命令。<br>对于webhook此处不显示内容。 |
| *User group* | 显示脚本可用的用户组（或*All*表示所有用户组）。 |
| *Host group* | 显示脚本可用的主机组（或*All*表示所有主机组）。 |
| *Host access* | 显示主机组的权限级别 - *读*或*写*。只有具备相应权限级别的用户才能执行该脚本。 |

要配置新脚本，请点击Top右上角的*创建脚本*按钮。

[comment]: # ({/e0ec1ae1-58923c7d})

[comment]: # ({44c45ea0-44c45ea0})
##### 批量编辑选项

列表下方的按钮提供批量编辑选项：

-   *Delete* - delete 脚本

使用此选项时，请勾选相应脚本前的复选框
并点击 *Delete*。

[comment]: # ({/44c45ea0-44c45ea0})

[comment]: # ({1c5dd978-1c5dd978})
##### 使用过滤器

您可以使用过滤器仅显示您感兴趣的脚本。为了获得更好的搜索性能，系统会以未解析宏的状态搜索数据。

*过滤器*链接位于脚本列表上方。点击该链接后，将显示一个过滤器界面，您可以根据名称和范围筛选脚本。

![](../../../../../assets/en/manual/web_interface/script_filter.png){width="600"}

[comment]: # ({/1c5dd978-1c5dd978})

[comment]: # ({c3985706-201a0633})
#### 配置全局脚本

![](../../../../../assets/en/manual/web_interface/script.png)

脚本属性:

| 参数 | <   | 描述 |
|-|----------|----------------------------------------|
| *Name* | <   | 脚本的唯一名称.<br>例如: `Clear /tmp filesystem` |
| *Scope* | <   | 脚本的作用范围 - 动作操作、手动主机操作或手动事件操作. 此设置决定了脚本的使用场景 - 在动作操作的远程命令中、从[主机菜单](/manual/web_interface/frontend_sections/monitoring/dashboard#主机菜单)或从[事件菜单](/manual/web_interface/frontend_sections/monitoring/problems#事件菜单)分别执行.<br>将作用域设置为'动作操作'会使脚本对所有具有*配置* → *动作*访问权限的用户可用.<br>如果脚本实际用于某个动作中，则其作用域不能从'动作操作'更改.<br>**宏支持**<br>作用域会影响可用宏的范围. 例如，用户相关宏({USER.\*})在脚本中受支持，以允许传递有关启动脚本的用户的信息. 但是，如果脚本作用域是动作操作，则不支持这些宏，因为动作操作是自动执行的.<br>要了解支持哪些宏，请在[supported macro](/manual/appendix/macros/supported_by_location)表中搜索'基于触发器的通知和命令/基于触发器的命令'、'手动主机操作脚本'和'手动事件操作脚本'. 请注意，如果宏可能解析为包含空格的值(例如主机名)，请根据需要添加引号. |
| *Menu path* | <   | 脚本的期望菜单路径. 例如, `Default` 或 `Default/`, 将在相应目录中显示脚本. 菜单可以嵌套, 例如 `Main menu/Sub menu1/Sub menu2`. 当通过监控部分中的主机/事件菜单访问脚本时，它们将按照给定的目录进行组织.<br>仅当选择'手动主机操作'或'手动事件操作'作为*作用域*时显示此字段. |
| *Type* | <   | 点击相应按钮选择脚本类型:<br>**Webhook**, **脚本**, **SSH**, **Telnet** 或 **[ipmi-远程命令](/manual/config/notifications/action/operation/remote_command#ipmi-远程命令)** 命令. |
|           | 脚本类型: Webhook | <           |
| ^ | *参数* | 指定webhook变量为属性-值对.<br>另请参阅: [Webhook](/manual/config/notifications/media/webhook) 媒体配置.<br>参数值中支持宏和自定义[user macros](/manual/config/macros/user_macros). 宏支持取决于脚本的作用域(见上面的*作用域*). |
| ^ | *脚本* | 在点击参数字段(或其旁边的查看/编辑按钮)后出现的块中输入JavaScript代码.<br>宏支持取决于脚本的作用域(见上面的*作用域*).<br>另请参阅: [Webhook](/manual/config/notifications/media/webhook) 媒体配置, [Additional JavaScript objects](/manual/config/items/preprocessing/javascript/javascript_objects). |
| ^ | *超时* | JavaScript执行超时时间(1-60秒, 默认30秒).<br>支持时间后缀, 例如30s, 1m. |
|           | 脚本类型: 脚本 | <           |
| ^ | *执行于* | 点击相应按钮以execute shell脚本在:<br>**Zabbix agent** - 脚本将由Zabbix agent执行(如果系统.run 监控项是[allowed](/manual/config/items/restrict_checks))在主机<br>**Zabbix server (proxy)** - 脚本将由Zabbix server或proxy执行(如果通过[EnableRemoteCommands](/manual/appendix/config/zabbix_proxy)启用) - 取决于主机是否由server 或 proxy监控<br>**Zabbix server** - 脚本将仅由Zabbix server执行 |
| ^ | *命令* | 输入脚本中要执行的命令的完整路径.<br>宏支持取决于脚本的作用域(见上面的*作用域*). 支持自定义[user macros](/manual/config/macros/user_macros). |
|           | 脚本类型: SSH | <           |
| ^ | *认证方法* | 选择认证方法 - 密码或公钥. |
| ^ | *用户名* | 输入用户名. |
| ^ | *密码* | 输入密码.<br>如果选择'密码'作为认证方法，则显示此字段. |
| ^ | *公钥file* | 输入公钥file的路径.<br>如果选择'公钥'作为认证方法，则显示此字段. |
| ^ | *私钥file* | 输入私钥file的路径.<br>如果选择'公钥'作为认证方法，则显示此字段. |
| ^ | *密码短语* | 输入密码短语.<br>如果选择'公钥'作为认证方法，则显示此字段. |
| ^ | *端口* | 输入端口号. |
| ^ | *命令* | 输入命令.<br>宏支持取决于脚本的作用域(见上面的*作用域*). 支持自定义[user macros](/manual/config/macros/user_macros). |
|           | 脚本类型: Telnet | <           |
| ^ | *用户名* | 输入用户名. |
| ^ | *密码* | 输入密码. |
| ^ | *端口* | 输入端口号. |
| ^ | *命令* | 输入命令.<br>宏支持取决于脚本的作用域(见上面的*作用域*). 支持自定义[user macros](/manual/config/macros/user_macros). |
|           | 脚本类型: IPMI | <           |
| ^ | *命令* | 输入IPMI命令.<br>宏支持取决于脚本的作用域(见上面的*作用域*). 支持自定义[user macros](/manual/config/macros/user_macros). |
| *Description* | <   | 输入脚本的描述. |
| *Host group* | <   | 选择脚本可用的主机组(或*所有*表示所有主机组).<br>**不建议**在此字段中使用发现的组. 当发现的组未被发现并被删除时，脚本作用域将重置为*所有*. |
| *User group* | <   | 选择脚本可用的用户组(或*所有*表示所有用户组).<br>仅当选择'手动主机操作'或'手动事件操作'作为*作用域*时显示此字段. |
| *Required host permissions* | <   | 选择主机组的权限级别 - *读取*或*写入*. 只有具有所需权限级别的用户才能执行脚本.<br>仅当选择'手动主机操作'或'手动事件操作'作为*作用域*时显示此字段. |
| *Enable confirmation* | <   | 勾选复选框以在执行脚本前显示确认消息. 此功能对于潜在危险操作(如重启脚本)或可能需要长时间的操作特别有用.<br>仅当选择'手动主机操作'或'手动事件操作'作为*作用域*时显示此选项. |
| *Confirmation text* | <   | 为上方的确认弹窗输入自定义确认文本(例如, *远程系统将重启. 确定吗?*). 要查看文本效果，点击字段旁边的*测试确认*.<br>支持{主机.\*}和{USER.\*}宏. 支持自定义[user macros](/manual/config/macros/user_macros).<br>*注意:* 测试确认消息时不会展开宏.<br>仅当选择'手动主机操作'或'手动事件操作'作为*作用域*时显示此字段. |

[comment]: # ({/c3985706-201a0633})

[comment]: # ({20cc53b9-ca68e16a})
#### 脚本执行与结果

脚本 run 由 Zabbix server 按照 [command execution page](/manual/appendix/command_execution) 中描述的顺序执行。

脚本结果会在脚本 run 后弹出的窗口中显示。脚本的返回值为标准输出：

-   若脚本成功完成 ([退出码检查](/manual/appendix/command_execution#退出码检查) `0`)，返回值限制为16MB（包含会被截断的尾部空格）。
-   若脚本因错误退出（非零退出码），返回值为限制为2KB的标准错误输出。

Zabbix默认不存储扩展脚本输出。如需保留完整输出细节，可在脚本内部实现日志记录（例如将输出重定向至本地日志 file）。

注意：对于在 Zabbix server 或 Zabbix proxy 上执行的脚本，[文本数据限制](/manual/config/items/item#文本数据限制) 同样适用。

以下是脚本及结果窗口的示例：

    uname -v
    /tmp/non_existing_script.sh
    echo "This script was started by {USER.USERNAME}"

![](../../../../../assets/en/manual/web_interface/frontend_sections/administration/script_result.png)

脚本结果不会显示脚本本身。

[comment]: # ({/20cc53b9-ca68e16a})

[comment]: # ({96d6e598-96d6e598})
#### 脚本超时

[comment]: # ({/96d6e598-96d6e598})

[comment]: # ({2c470358-5b600786})
##### Zabbix agent

在执行脚本时可能会遇到超时的情况.

以下是在Zabbix agent上运行的脚本示例及其结果窗口:

    sleep 5
    df -h

![](../../../../../assets/en/manual/web_interface/frontend_sections/administration/script_timeout_1.png)

这种情况下出现的错误信息如下:

    Timeout while executing a shell script.

为避免这种情况,建议通过修改[Zabbix agent
configuration](/manual/appendix/config/zabbix_agentd)和[Zabbix server
configuration](/manual/appendix/config/zabbix_server)来优化脚本本身(而不是将Timeout参数调整为相应值,在我们的例子中是> `5`).

如果在[Zabbix agent
configuration](/manual/appendix/config/zabbix_agentd)中更改了Timeout参数,将出现以下错误信息:

    Get value from agent failed: ZBX_TCP_READ() timed out.

这意味着修改是在[Zabbix agent
configuration](/manual/appendix/config/zabbix_agentd)中进行的,同时也需要在[Zabbix server
configuration](/manual/appendix/config/zabbix_server)中修改Timeout设置.

[comment]: # ({/2c470358-5b600786})

[comment]: # ({0b38e381-0b38e381})
##### Zabbix server/proxy

查看在Zabbix server上运行的脚本示例及下方结果窗口:

    sleep 11
    df -h

![](../../../../../assets/en/manual/web_interface/frontend_sections/administration/script_timeout_3.png)

还建议通过修改[Zabbix server
configuration](/manual/appendix/config/zabbix_server)来优化脚本本身(而非将TrapperTimeout参数调整为对应值(本例中>‘11’))

[comment]: # ({/0b38e381-0b38e381})
