3 脚本
概述
在 告警 > 脚本 部分,可以配置和维护用户定义的全局脚本。
全局脚本会根据配置的作用域以及用户权限,可在以下位置执行:
脚本可在 Zabbix agent、Zabbix 服务器(proxy)或仅 Zabbix 服务器上执行。
另请参见命令执行。
在 Zabbix agent 和 Zabbix proxy 上,远程脚本默认均为禁用状态。
可通过以下方式启用:
- 对于在 Zabbix agent 上执行的远程命令:
- 在 agent 配置中,为每个允许的命令添加
AllowKey=system.run[<command>,\*]参数,其中 * 表示 wait 和 nowait 模式;
- 在 agent 配置中,为每个允许的命令添加
- 对于在 Zabbix proxy 上执行的远程命令:
- 警告:如果远程命令是在由 Zabbix proxy 监控的 Zabbix agent 上执行,则无需在 Zabbix proxy 上启用远程命令。 但是,如果确实需要在 Zabbix proxy 上执行远程命令,请在 proxy 配置中将 EnableRemoteCommands 参数设置为“1”。
可通过在服务器配置中设置 EnableGlobalScripts=0 来禁用在 Zabbix 服务器上执行全局脚本。
对于新安装环境,自 Zabbix 7.0 起,Zabbix 服务器上的全局脚本执行默认处于禁用状态。
系统会显示现有脚本及其详细信息列表。

显示的数据:
| 列 | 说明 |
|---|---|
| 名称 | 脚本名称。单击脚本名称将打开脚本配置表单。 |
| 作用域 | 脚本的作用域——动作操作、手动主机操作或手动事件操作。此设置决定脚本可在哪些位置使用。 |
| 用于动作 | 显示使用该脚本的所有动作,并在前面标出这些动作的总数。 单击动作名称将打开动作配置表单。如果用户对该动作没有权限,则名称不可点击。 |
| 类型 | 显示脚本类型——URL、Webhook、Script、SSH、Telnet 或 IPMI 命令。 |
| 执行位置 | 显示脚本将在 Zabbix agent、Zabbix proxy、服务器上执行,或仅在 Zabbix 服务器上执行。 |
| 命令 | 显示脚本中要执行的所有命令。 对于 webhook,此处不显示任何内容。 |
| 用户组 | 显示该脚本可供使用的用户组(如果对所有用户组可用,则显示 All)。 |
| 主机组 | 显示该脚本适用的主机组(如果对所有主机组可用,则显示 All)。 |
| 主机访问 | 显示主机组的权限级别——Read 或 Write。只有具有所需权限级别的用户才能执行该脚本。 |
要配置新脚本,请单击右上角的 创建脚本 按钮。
批量编辑选项
列表下方的按钮提供了一个批量编辑选项:
- 删除 - 删除脚本
要使用此选项,请在相应脚本前面勾选复选框,然后单击 删除。
使用筛选器
您可以使用筛选器仅显示您感兴趣的脚本。 为了获得更好的搜索性能,数据在搜索时不会解析宏。
筛选器 链接位于脚本列表上方。 单击该链接后,将显示一个筛选器,您可以按名称和范围筛选脚本。

配置全局脚本

建议在全局脚本中使用宏函数而不是普通宏,以增强安全性,因为宏不会被自动转义。
脚本属性:
| 参数 | 说明 | |
|---|---|---|
| 名称 | 脚本的唯一名称。 例如: Clear /tmp filesystem |
|
| 作用域 | 脚本的作用域——动作操作、手动主机操作或手动事件操作。此设置决定了脚本可在何处使用——分别可用于动作操作的远程命令、从主机菜单或从事件菜单中使用。 将作用域设置为“动作操作”后,所有有权访问 警报 > 动作 的用户都可以使用该脚本。 如果某个脚本实际上已在某个动作中使用,则其作用域不能再从“动作操作”更改为其他值。 宏支持 作用域会影响可用宏的范围。例如,用户相关宏({USER.*})在脚本中受支持,以便传递启动脚本的用户信息。但是,如果脚本作用域为动作操作,则不支持这些宏,因为动作操作是自动执行的。 {MANUALINPUT} 宏允许在脚本执行时指定手动输入。它支持用于手动主机操作和手动事件操作脚本。 要了解还支持哪些其他宏,请在支持的宏表中搜索“基于触发器的通知和命令/基于触发器的命令”、“手动主机操作脚本”和“手动事件操作脚本”。请注意,如果某个宏可能解析为包含空格的值(例如主机名),请不要忘记根据需要加引号。 |
|
| 菜单路径 | 脚本所需的菜单路径。例如,Default 或 Default/ 将在相应目录中显示该脚本。菜单可以嵌套,例如 Main menu/Sub menu1/Sub menu2。在监控部分通过主机/事件菜单访问脚本时,它们将根据给定目录进行组织。仅当 作用域 选择“手动主机操作”或“手动事件操作”时显示此字段。 |
|
| 类型 | 单击相应按钮以选择脚本类型: URL、Webhook、Script、SSH、Telnet 或 IPMI 命令。 URL 类型仅在 作用域 选择“手动主机操作”或“手动事件操作”时可用。 |
|
| 脚本类型:URL | ||
| URL | 指定 URL,以便从主机菜单或事件菜单快速访问。 支持宏和自定义用户宏。宏支持取决于脚本的作用域(见上文 作用域)。 在此字段中使用 {MANUALINPUT} 宏,可在脚本执行时指定手动输入,例如: http://{MANUALINPUT}/zabbix/zabbix.php?action=dashboard.view宏值不得进行 URL 编码。 |
|
| 在新窗口中打开 | 确定 URL 应在新的浏览器标签页中打开还是在当前标签页中打开。 | |
| 脚本类型:Webhook | ||
| 参数 | 将 webhook 变量指定为属性-值对。 另请参见:Webhook 媒介配置。 参数值中支持宏和自定义用户宏。宏支持取决于脚本的作用域(见上文 作用域)。 |
|
| 脚本 | 在参数字段中单击或单击其旁边的铅笔图标时,会打开模态编辑器;请在其中输入 JavaScript 代码。 宏支持取决于脚本的作用域(见上文 作用域)。 另请参见:Webhook 媒介配置、附加 Javascript 对象。 |
|
| 超时 | JavaScript 执行超时(1-60 秒,默认 30 秒)。 支持时间后缀,例如 30s、1m。 |
|
| 脚本类型:Script | ||
| 执行位置 | 单击相应按钮以在以下位置执行 shell 脚本: Zabbix agent - 脚本将由 Zabbix agent 在主机上执行(如果 system.run 监控项被允许) Zabbix proxy or server - 脚本将由 Zabbix proxy 或服务器执行,具体取决于主机是由 proxy 还是服务器监控。 如果通过 EnableRemoteCommands 启用,则会在 proxy 上执行。 如果通过服务器参数 EnableGlobalScripts 启用全局脚本,则会在服务器上执行。 Zabbix server - 脚本将仅由 Zabbix 服务器执行。 如果通过服务器参数 EnableGlobalScripts 禁用了全局脚本,则此选项不可用。 |
|
| 命令 | 输入要在脚本中执行的命令的完整路径。 宏支持取决于脚本的作用域(见上文 作用域)。支持自定义用户宏。 |
|
| 脚本类型:SSH | ||
| 认证方式 | 选择认证方式——密码或公钥。 | |
| 用户名 | 输入用户名。 | |
| 密码 | 输入密码。 仅当认证方式选择“密码”时,此字段可用。 |
|
| 公钥文件 | 输入公钥文件的路径。 仅当认证方式选择“公钥”时,此字段可用。 |
|
| 私钥文件 | 输入私钥文件的路径。 仅当认证方式选择“公钥”时,此字段可用。 |
|
| 口令 | 输入口令。 仅当认证方式选择“公钥”时,此字段可用。 |
|
| 端口 | 输入 Zabbix 将连接到的目标主机上的远程 SSH 服务端口。 | |
| 命令 | 输入命令。 宏支持取决于脚本的作用域(见上文 作用域)。支持自定义用户宏。 |
|
| 脚本类型:Telnet | ||
| 用户名 | 输入用户名。 | |
| 密码 | 输入密码。 | |
| 端口 | 输入 Zabbix 将连接到的目标主机上的远程 Telnet 服务端口。 | |
| 命令 | 输入命令。 宏支持取决于脚本的作用域(见上文 作用域)。支持自定义用户宏。 |
|
| 脚本类型:IPMI | ||
| 命令 | 输入 IPMI 命令。 宏支持取决于脚本的作用域(见上文 作用域)。支持自定义用户宏。 |
|
| 描述 | 输入脚本的描述。 | |
| 主机组 | 选择该脚本可用于哪个主机组(或选择 全部 以适用于所有主机组)。 | |
| 用户组 | 选择该脚本可供哪个用户组使用(或选择 全部 以适用于所有用户组)。 仅当 作用域 选择“手动主机操作”或“手动事件操作”时显示此字段。 |
|
| 所需主机权限 | 为主机组选择权限级别——读 或 写。只有具有所需权限级别的用户才能执行该脚本。 仅当 作用域 选择“手动主机操作”或“手动事件操作”时显示此字段。 |
|
| 高级配置 | 单击 高级配置 标签以显示高级配置选项。 仅当 作用域 选择“手动主机操作”或“手动事件操作”时显示此字段。 |
|
高级配置
高级配置选项可在可折叠的 高级配置 部分中找到:

| 参数 | 描述 |
|---|---|
| 启用用户输入 | 勾选复选框以在执行脚本之前启用手动用户输入。 手动用户输入将替换脚本中的 {MANUALINPUT} 宏值。 参见:手动用户输入。 |
| 输入提示 | 输入自定义文本,提示进行自定义用户输入。此文本将显示在 手动输入 弹出窗口的输入字段上方。 要查看 手动输入 弹出窗口的预览,请单击 测试用户输入。预览还允许测试输入字符串是否符合输入验证规则(参见下面的参数)。 宏和用户宏支持取决于脚本的范围(参见一般脚本配置参数中的 范围)。 |
| 输入类型 | 选择手动输入类型: 字符串 - 单个字符串; 下拉菜单 - 从多个下拉选项中选择值。 |
| 下拉菜单选项 | 在逗号分隔的列表中输入用户输入下拉菜单的唯一值。 要在下拉菜单中包含空选项,请在列表的开头、中间或结尾额外添加逗号。 仅当选择“下拉菜单”作为 输入类型 时显示此字段。 |
| 默认输入字符串 | 输入用户输入的默认字符串(或不输入)。 此字段将根据提供的 输入验证规则 正则表达式进行验证。 在 手动输入 弹出窗口中,默认情况下将显示此处输入的值。 仅当选择“字符串”作为 输入类型 时显示此字段。 |
| 输入验证规则 | 输入用于验证用户输入字符串的正则表达式。 支持全局正则表达式。 仅当选择“字符串”作为 输入类型 时显示此字段。 |
| 启用确认 | 勾选复选框以在执行脚本之前显示确认消息。这个功能在执行可能危险的操作(例如重新启动脚本)或可能需要较长时间的操作时特别有用。 |
| 确认文本 | 输入用于确认弹出窗口的自定义确认文本(例如,“远程系统将重新启动。您确定吗?”)。要查看文本的外观,单击该字段旁边的 测试确认。 支持宏和自定义用户宏。 注意:在测试确认消息时,宏不会被扩展。 |
如果同时配置了手动用户输入和确认消息,则它们将依次显示在弹出窗口中。
手动用户输入
手动用户输入允许在每次执行脚本时提供一个自定义参数。
这样就无需创建多个仅有单个参数差异的类似用户脚本。
例如,您可能希望在执行期间向脚本提供不同的整数或不同的 URL 地址。
要启用手动用户输入:
- 在需要的位置于脚本中(命令、脚本、脚本参数)使用 {MANUALINPUT} 宏;或者在 URL 脚本的 URL 字段中使用;
- 在高级脚本配置中,启用手动用户输入并配置输入选项。
启用用户输入后,在脚本执行之前,将向用户显示一个手动输入弹出窗口,要求其提供自定义值。
提供的值将替换脚本中的 {MANUALINPUT}。
根据配置,系统将要求用户输入一个字符串值:

或者从预定义选项的下拉列表中选择一个值:

手动用户输入仅适用于作用域为“手动主机操作”或“手动事件操作”的脚本。
脚本执行和结果
由 Zabbix 服务器运行的脚本将按照命令执行页面中描述的顺序执行。
脚本运行后,结果会显示在弹出的窗口中。 脚本的返回值为标准输出:
- 如果脚本成功完成(退出代码为
0),返回值限制为 16MB(包括会被截断的尾随空白字符)。 - 如果脚本因错误退出(非零退出代码),返回值为标准错误,限制为 2KB。
默认情况下,Zabbix 不会存储扩展的脚本输出。 要保留完整的输出详情,可以在脚本本身中实现日志记录(例如,将输出重定向到本地日志文件)。
请注意,对于在 Zabbix 服务器或 Zabbix proxy 上执行的脚本,数据库限制同样适用。
下面是一个脚本及其结果窗口的示例:
uname -v
/tmp/non_existing_script.sh
echo "This script was started by {USER.USERNAME}"

脚本结果中不会显示脚本本身。
Zabbix agent 上的脚本超时
您可能会遇到在执行脚本时发生超时的情况。
请参见下面在 Zabbix agent 上运行的脚本及其结果窗口示例:
sleep 5
df -h

在这种情况下,错误消息如下:
Timeout while executing a shell script.
为避免此类情况,建议优化脚本本身(在上述示例中为“5”),而不是调整 Zabbix agent configuration 和 Zabbix server configuration 中的 Timeout 参数。
如果已在 Zabbix agent configuration 中更改了 Timeout 参数,则会出现以下错误消息:
Get value from agent failed: ZBX_TCP_READ() timed out.
这意味着修改已在 Zabbix agent configuration 中完成,但还需要同时在 Zabbix server configuration 中修改 Timeout 参数。
active agent 上的脚本超时
只能在以主动模式运行的 agent 上执行脚本。 一旦通过动作操作或手动执行脚本触发脚本执行,该命令就会被包含在主动检查配置中,并在 active agent 接收到后执行一次。
手动脚本会连同用于脚本执行的服务器/proxy 超时时间一起发送给 active agent。请增大用于脚本执行的默认服务器/proxy超时时间。 该超时时间必须高于主动检查刷新频率,否则在 active agent 接收到脚本并能够返回结果之前,超时时间就已经耗尽。
Zabbix 服务器/proxy 上的脚本超时
请参见下面在 Zabbix 服务器上运行脚本及其结果窗口的示例:
sleep 11
df -h

同时也建议优化脚本本身(而不是通过修改 Zabbix 服务器配置 将 TrapperTimeout 参数调整为相应的值(在本例中,>11))。