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

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

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

使用远程命令，您可以预定义在某些情况下会在受监控主机上自动执行的命令。

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

在该功能最显而易见的用途中，你可以尝试：

-   自动重启某些没有响应的应用（web服务器、中间件、CRM）

-   使用IPMI 'reboot'命令重启某些确实无法响应的服务器。

-   磁盘空间不足时自动释放（删除旧文件、清理）
    
-   根据CPU负载将VM从一台物理机迁移到另一台
    
-   CPU（磁盘、内存或其他）资源不足时向云环境添加新节点

为远程命令配置操作与发送消息类似，唯一的区别是 Zabbix 将执行一个命令而不是发送消息。

远程命令可以由Zabbix Server、Proxy 或agent执行。Zabbix agent上的远程命令可以由Zabbix Server或通过 Proxy 执行。Zabbix agent和Zabbix Proxy上的远程命令默认都是禁用的。 它们可以通过以下方式启用：

-   在agent的配置中添加一个`AllowKey=system.run[*]` 参数；

-   在代理的配置中将`EnableRemoteCommands`参数设为‘1’。 

由 Zabbix server执行的远程命令按照[命令执行](/manual/appendix/command_execution)所述运行，包括退出代码检查。

即使目标主机在维护状态，远程命令也会执行。

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

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

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

|Database|字符限制|字节限制|
|---|---|---|
|MySQL|65535|65535|
|PostgreSQL|65535|不受限制|
|SQLite（仅 Zabbix proxy）|65535|不受限制|

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

[comment]: # ({/28ef02d2-7ca4c9c3})

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

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

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

然后，在 *告警 → 动作 → 触发器动作* 中配置新动作时：

1.  定义相应的条件，
    例如，设置为当 Apache 应用中的任一严重问题发生时激活动作。

![](../../../../../../assets/en/manual/config/notifications/action/conditions_restart.png){width="600"}

2.  在 [*操作*](/manual/config/notifications/action/operation#configuring-an-operation) 选项卡中，
    在 *操作*、*恢复操作* 或 *更新操作* 区块里点击 *添加*。

![](../../../../../../assets/en/manual/config/notifications/action/operations.png){width="600"}

3.  从 *操作* 下拉列表中选择一个预定义脚本，并为该脚本设置 *目标列表*。

![](../../../../../../assets/en/manual/config/notifications/action/operation_restart_webserver.png){width="600"}

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

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

可用于动作操作（webhook、脚本、SSH、Telnet、IPMI）的脚本在[全局脚本](/manual/web_interface/frontend_sections/alerts/scripts)中定义。

例如：

    sudo /etc/init.d/apache restart 

在这种情况下，Zabbix 将尝试重启 Apache 进程。使用此命令时，请确保该命令在 Zabbix agent 上执行（点击 *Execute on* 对应的 *Zabbix agent* 按钮）。

::: noteimportant
请注意使用 **sudo** —— 默认情况下，Zabbix 用户没有重启系统服务的权限。有关如何配置 **sudo** 的提示，请参见下文。
:::

::: noteclassic
从 Zabbix agent 7.0 开始，也可以在以主动模式运行的 agent 上执行远程命令。
Zabbix agent——无论是主动还是被动——都应运行在远程主机上，并在后台执行这些命令。
:::

Zabbix agent 上的远程命令通过 system.run\[,nowait\] 键执行，不设超时，也不会检查执行结果。  
在 Zabbix 服务器和 Zabbix proxy 上，远程命令会按照 zabbix\_server.conf 或 zabbix\_proxy.conf 文件中 [TrapperTimeout](/manual/appendix/config/zabbix_server#trappertimeout) 参数设置的超时时间执行，并会[检查](/manual/appendix/command_execution#exit-code-checking)执行结果。  
更多信息，请参见[*脚本超时*](/manual/web_interface/frontend_sections/alerts/scripts#script-timeout)。

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

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

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

    visudo

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

    # 允许 'zabbix' 用户无需密码运行所有命令。
    zabbix ALL=NOPASSWD: ALL

    # 允许 'zabbix' 用户无需密码重启 apache。
    zabbix ALL=NOPASSWD: /etc/init.d/apache restart

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

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

[comment]: # ({7726777a-1f3becef})
#### 使用多个接口的远程命令

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

可以通过 SSH 和 Telnet 使用不同于 Zabbix agent 接口的
其他接口来执行远程命令。可用接口将按以下顺序选择：

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

[comment]: # ({/7726777a-1f3becef})

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

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

    <command> [<value>]

其中

-   <command>——表示一个没有空格的IPMI命令。
-   <value>——其值为'on'、'off' 或任何无符号整数，<value> 是可选参数。

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

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

可在操作中用作远程命令的[全局脚本](/manual/web_interface/frontend_sections/alerts/scripts#configuring-a-global-script)示例。

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

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

在特定条件下重启Windows。

为了根据Zabbix检测到的问题自动重启Windows，定义如下脚本：

|脚本参数|值|
|----------------|-----|
|*范围*|'Action operation'|
|*类型*|'Script'|
|*命令*|c:\\windows\\system32\\shutdown.exe -r -f|

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

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

用 IPMI控制重启主机。

|脚本参数|值|
|----------------|-----|
|*范围*|'Action operation'|
|*类型*|'IPMI'|
|*命令*|reset|

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

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

使用 IPMI控制关闭主机电源。

|脚本参数|值|
|----------------|-----|
|*范围*|'Action operation'|
|*类型*|'IPMI'|
|*命令*|power off|

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