[comment]: # ({0cdc5e2e-0cdc5e2e})
# 2 远程命令

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

[comment]: # ({36945095-36945095})
#### 概述

通过远程命令功能，您可以定义当满足特定条件时，在受监控的主机上自动执行预定义的命令。

因此远程命令是实现智能主动监控的强大机制。

该功能最典型的应用场景包括：

-   当应用程序（如Web服务器、中间件、CRM系统）无响应时自动重启
-   使用IPMI的'reboot'命令重启无响应的远程服务器
-   当磁盘空间不足时自动清理空间（删除旧文件、清空/tmp目录）
-   根据CPU负载情况将虚拟机迁移至不同物理主机
-   在CPU（磁盘等）资源不足时为云环境添加新节点

    memory, whatever) resources

配置远程命令操作与配置消息发送操作类似，唯一区别在于Zabbix将execute命令而非发送消息。

远程命令可由Zabbix server、proxy或agent执行。在Zabbix agent上的远程命令可直接由Zabbix server执行或通过Zabbix proxy执行。无论是Zabbix agent还是Zabbix proxy，远程命令功能默认均处于禁用状态。可通过以下方式启用：

-   在agent配置中添加`AllowKey=system.run[*]`参数
-   在proxy中将EnableRemoteCommands参数设为'1'

    configuration.

由Zabbix server执行的远程命令会按照[Command execution](/manual/appendix/command_execution)文档所述进行run，包括退出码检查。

即使目标主机处于维护状态，远程命令仍会执行。

[comment]: # ({/36945095-36945095})

[comment]: # ({6570aba1-7ca4c9c3})
##### 远程命令限制

解析完所有宏后的远程命令限制取决于数据库类型和字符集（非ASCII字符需要多于一个字节存储）：

| 数据库 | 字符数限制 | 字节数限制 |
|---|---|---|
| MySQL    | 65535               | 65535          |
| Oracle数据库 | 2048                | 4000           |
| PostgreSQL | 65535               | 无限制    |
| SQLite (仅Zabbix proxy) | 65535               | 无限制    |

远程命令执行输出（返回值）限制为16MB（包括被截断的尾部空白字符）。
[IPMI远程命令](#ipmi-remote-commands)的限制基于安装的IPMI库。
请注意[文本数据限制](/manual/config/items/item#文本数据限制)适用于所有远程命令。

[comment]: # ({/6570aba1-7ca4c9c3})

[comment]: # ({d9d0b5bd-349859a6})
#### 配置

在Zabbix agent上执行的远程命令（自定义脚本）
必须先在agent中启用
[configuration](/manual/appendix/config/zabbix_agentd).

确保在agent配置中为每个允许的命令添加AllowKey=system.run[<command>,\*]参数，以允许特定命令使用nowait模式。如果更改此参数，请重启agent守护进程。

::: noteimportant
远程命令不适用于活动的Zabbix
agents.

:::

然后，在*配置 → 动作*中配置新动作时：

-   定义适当的条件。在此示例中，设置

    action is activated upon any disaster problems with one of Apache
    applications:

![](../../../../../../assets/en/manual/config/notifications/action/conditions_restart.png)

-   在
    *[配置操作](/manual/config/notifications/action/operation#配置操作)*
    选项卡中，点击操作/恢复操作/更新操作块中的添加
-   从操作下拉字段中选择一个预定义的

    scripts

![](../../../../../../assets/en/manual/config/notifications/action/operation_restart_webserver.png)

-   为脚本选择目标列表

[comment]: # ({/d9d0b5bd-349859a6})

[comment]: # ({c5296379-c5296379})
#### 预定义脚本

所有可用的脚本（webhook、脚本、SSH、Telnet、IPMI）
操作动作定义于[global
scripts](/manual/web_interface/frontend_sections/administration/scripts)。

例如:

    sudo /etc/init.d/apache restart 

在这种情况下，Zabbix将尝试重启Apache进程。通过此
命令，确保该命令在Zabbix agent上执行（点击
*Zabbix agent* 按钮旁边的 *Execute on*（执行于）。

::: noteimportant
注意使用**sudo** - Zabbix用户不具备
默认具有重启系统服务的权限。详情请参阅下文：
配置 **sudo** 的提示

:::

::: noteclassic
Zabbix agent 应 run 远程 主机 并接受
传入连接。Zabbix agent 执行命令于
背景

:::

Zabbix agent上的远程命令执行时没有超时限制
system.run\[,nowait\] 键且不会检查执行结果。
Zabbix server和Zabbix proxy，远程命令通过
在zabbix\_server.conf的TrapperTimeout参数中设置的超时时间或
zabbix\_proxy.conf file 及其相关配置
[退出码检查](/manual/appendix/command_execution#退出码检查) 用于
执行结果

[comment]: # ({/c5296379-c5296379})

[comment]: # ({69bb3fd0-a1b1e7ea})
#### 访问权限

确保'zabbix'用户对配置的命令拥有execute权限。可以考虑使用**sudo**来授予特权命令的访问权限。要配置访问权限，请以root身份execute：

    visudo

可在*sudoers* file中使用的示例行：

    # allows 'zabbix' user to run all commands without password.
    zabbix ALL=NOPASSWD: ALL

    # 允许'zabbix'用户无需密码重启apache

    zabbix ALL=NOPASSWD: /etc/init.d/apache restart

::: notetip
在某些系统上，*sudoers* file会阻止非本地用户执行命令。要更改此设置，请在*/etc/sudoers*中注释掉**requiretty**选项。

:::

[comment]: # ({/69bb3fd0-a1b1e7ea})

[comment]: # ({927835c3-1f3becef})
#### 具有多个接口的远程命令

如果目标系统具有多个选定类型的接口
(Zabbix agent 或 IPMI)，远程命令将在默认
接口上执行。

可以通过 SSH 和 Telnet 使用不同于 Zabbix agent 的接口
execute 远程命令。可用接口的
选择顺序如下：

 
* Zabbix agent 默认接口
 * SNMP 默认接口
 * JMX 默认接口
 * IPMI 默认接口

[comment]: # ({/927835c3-1f3becef})

[comment]: # ({26b199db-26b199db})
#### IPMI 远程命令

对于IPMI远程命令，应使用以下语法：

    <command> [<value>]

其中

-   <command> - 不带空格的IPMI命令之一
-   <value> - 'on'、'off'或任意无符号integer。<value>
    为可选参数。

[comment]: # ({/26b199db-26b199db})

[comment]: # ({c230845b-c230845b})
#### 示例

可作为动作操作中远程命令使用的[配置全局脚本](/manual/web_interface/frontend_sections/administration/scripts#配置全局脚本)示例。

[comment]: # ({/c230845b-c230845b})

[comment]: # ({d7dd6ab7-1d68d18d})
**示例1**

在特定条件下重启Windows.

为了在Zabbix检测到问题时自动重启Windows，请定义以下脚本：

| 脚本参数 | 值 |
|--|--------|
| *Scope* | '操作动作' |
| *Type* | '脚本' |
| *Command* | c:\\windows\\system32\\shutdown.exe -r -f |

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

[comment]: # ({ec94582c-8e3d9a17})
**示例 2**

通过IPMI控制重启主机.

| 脚本参数 | 值 |
|--|--------|
| *Scope* | '操作动作' |
| *Type* | 'IPMI' |
| *Command* | reset |

[comment]: # ({/ec94582c-8e3d9a17})

[comment]: # ({d6c364f2-c9d4e7c6})
**示例 3**

通过IPMI控制关闭主机.

| 脚本参数 | 值 |
|--|--------|
| *Scope* | '操作动作' |
| *Type* | 'IPMI' |
| *Command* | 关闭电源 |

[comment]: # ({/d6c364f2-c9d4e7c6})
