[comment]: # translation:outdated

[comment]: # ({e3b6b1e8-26d9bc44})
# 9 SSH检查

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

[comment]: # ({206bdf94-4cdff2c1})
### 概述

SSH 检查以无代理监控的形式执行。SSH 检查不需要 Zabbix agent。

要执行 SSH 检查，Zabbix 服务器必须首先[配置](/manual/installation/install#from_the_sources) SSH2支持 (libssh 或 libssh2)。另请参阅：[要求](/manual/installation/requirements#serverproxy)。

::: noteimportant
从 RHEL 8 开始，仅支持 libssh。对于其他发行版，建议使用 libssh 而不是 libssh2。
:::

[comment]: # ({/206bdf94-4cdff2c1})

[comment]: # ({41d27374-5d32b87c})
#### 配置

[comment]: # ({/41d27374-5d32b87c})

[comment]: # ({69e9c4a5-753f5c30})
##### 密码验证

SSH 检查提供两种验证方法 - 用户/密码对和基于密钥文件。

如果您不打算使用密钥，则无需进行其他配置，除了将 libssh 或 libssh2 链接到 Zabbix（如果您从源代码构建）之外。

[comment]: # ({/69e9c4a5-753f5c30})

[comment]: # ({a81cdae5-44fd07da})
##### 密钥文件身份验证

要对 SSH 监控项使用基于密钥的身份验证，需要对服务器配置进行某些更改。

以“root”身份打开 Zabbix 服务器配置文件
([*zabbix\_server.conf*](/manual/appendix/config/zabbix_server))
并查找以下行：

```ini
# SSHKeyLocation=
```

取消注释并设置公钥和私钥所在文件夹的完整路径：

```ini
SSHKeyLocation=/home/zabbix/.ssh
```

保存文件并重新启动 Zabbix 服务器。

此处的路径 */home/zabbix* 是 *zabbix* 用户帐户的主目录，而 *.ssh* 是默认的目录，其中的公钥和私钥将由主目录中的 [ssh-keygen](http://en.wikipedia.org/wiki/Ssh-keygen) 命令生成。

通常，不同操作系统发行版的 Zabbix 服务器安装包会在其他地方创建 *zabbix* 用户帐户，其主目录为 */var/lib/zabbix*（对于系统帐户而言）。

在生成密钥之前，您可以将主目录重新分配到 */home/zabbix*，以便它与上面提到的 `SSHKeyLocation` Zabbix 服务器配置参数相对应。

::: noteclassic
如果已根据 [安装部分](/manual/installation/install#create_user_account) 手动添加了 *zabbix* 帐户，则可以跳过以下步骤。在这种情况下，*zabbix* 帐户的主目录很可能已经是*/home/zabbix*。
:::

要更改 *zabbix* 用户帐户的主目录，必须停止所有正在使用它的工作进程：

```bash
service zabbix-agent stop
service zabbix-server stop
```

要更改主目录位置并尝试移动它（如果存在），应执行以下命令：

```bash
usermod -m -d /home/zabbix zabbix
```

也可能主目录在旧位置不存在，因此应在新位置创建它。一个安全的尝试是：

```bash
test -d /home/zabbix || mkdir /home/zabbix
```

为了确保一切安全，可以执行其他命令来设置主目录的权限：

```bash
chown zabbix:zabbix /home/zabbix
chmod 700 /home/zabbix
```

现在可以重新启动先前停止的进程：

```bash
service zabbix-agent start
service zabbix-server start
```

现在，可以使用以下命令执行生成公钥和私钥的步骤（为了更好的可读性，命令提示符被注释掉）：

```bash
sudo -u zabbix ssh-keygen -t rsa
# 生成公钥/私钥 rsa 密钥对。
# 输入要保存密钥的文件 (/home/zabbix/.ssh/id_rsa):
/home/zabbix/.ssh/id_rsa
# 输入密码（空表示无密码）：
<留空>
# 再次输入相同的密码：
<留空>
# 您的身份已保存在 /home/zabbix/.ssh/id_rsa 中。
# 您的公钥已保存在 /home/zabbix/.ssh/id_rsa.pub 中。
# 密钥指纹为：
# 90:af:e4:c7:e3:f0:2e:5a:8d:ab:48:a2:0c:92:30:b9 zabbix@it0
# 密钥的随机图像为：
# +--[ RSA 2048]----+
# | |
# | . |
# | o |
# | . o |
# |+ . S |
# |.+ o = |
# |E . * = |
# |=o . ..* . |
# |... oo.o+ |
# +-----------------+
```

::: noteclassic
公钥和私钥（*id\_rsa.pub* 和 *id\_rsa*）已默认在 */home/zabbix/.ssh* 目录中生成，该目录对应于 Zabbix 服务器 `SSHKeyLocation` 配置参数。
:::

::: noteimportant
ssh-keygen 工具和 SSH 服务器可能支持除“rsa”之外的密钥类型，但 Zabbix 使用的 libssh2 可能不支持这些密钥类型。
:::

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

[comment]: # ({b84f1792-7e6b0273})
##### Shell 配置表

对于每个将由 SSH 检查监控的主机，此步骤仅应执行一次。

通过使用以下命令，可以在远程主机 *10.10.10.10* 上安装 **公钥** 文件，以便可以使用 *root* 帐户执行 SSH 检查（为了更好的可读性，命令提示符被注释掉）：

```bash
sudo -u zabbix ssh-copy-id root@10.10.10.10
# 无法确定主机 '10.10.10.10 (10.10.10.10)' 的真实性。
# RSA 密钥指纹为 38:ba:f2:a4:b5:d9:8f:52:00:09:f7:1f:75:cc:0b:46。
# 您确定要继续连接吗（是/否）？
是
# 警告：已将“10.10.10.10”（RSA）永久添加到已知主机列表中。
# root@10.10.10.10 的密码：
<输入 root 密码>
# 现在尝试使用“ssh 'root@10.10.10.10'”登录机器，
# 并检查以确保只添加了您想要的密钥。
```

现在可以使用默认私钥（*/home/zabbix/.ssh/id\_rsa*）检查 *zabbix* 用户帐户的 SSH 登录：

```bash
sudo -u zabbix ssh root@10.10.10.10
```

如果登录成功，则 shell 中的配置部分已完成，可以关闭远程 SSH 会话。

[comment]: # ({/b84f1792-7e6b0273})

[comment]: # ({e6ddb211-fe23daa8})
##### 监控项配置

实际要执行的命令必须放在监控项配置中的 *执行脚本*字段中。通过将多个命令放在新行上，可以一个接一个地执行它们。在这种情况下，返回的值也将被格式化为多行。

![](../../../../../assets/en/manual/config/items/itemtypes/ssh_item.png){width="600"}

所有必填输入字段都标有红色星号。

需要 SSH 监控项特定信息的字段是：

|参数|描述|注释|
|--|------|------|
|*类型*|在此处选择**SSH 代理**。| |
|*键值*|格式为 **ssh.run\[unique short description,<ip>,<port>,<encoding>,<ssh options>\]**|**unique short description** 的唯一（每个主机）监控项键值是必需的，并且每个主机的每个 SSH 监控项都应该是唯一的。<br><br>默认端口为 22，而不是此监控项分配到的接口中指定的端口。<br><br>**ssh 选项** 允许以 *key1=value1;key2=value2,value3* 格式传递其他 SSH 选项。一个键值的多个值可以用逗号分隔传递（在这种情况下，参数必须是 [quote](/manual/config/items/item/key#parameter---quoted-string)）；多个选项键值可以用分号分隔传递。支持的选项键和值取决于 SSH 库。请注意，不支持使用“+”号来附加密码设置和使用“！”来禁用特定密码设置（如 GnuTLS 和 OpenSSL 中）。<br><br>示例：<br>=> `ssh.run[KexAlgorithms,127.0.0.1,,,Ciphers=aes128-ctr]`<br>=> `ssh.run[KexAlgorithms,,,,"KexAlgorithms=diffie-hellman-group1-sha1;HostkeyAlgorithms=ssh-rsa,ssh-dss,ecdh-sha2-nistp256"]`|
|*身份验证方法*|“密码”或“公钥”之一。| |
|*用户名*|用于在远程主机上进行身份验证的用户名（最多 255 个字符）。必填。| |
|*公钥文件*|如果*身份验证方法*为“公钥”，则为公钥的文件名。必填。|示例：*id\_rsa.pub* - 由命令 [ssh-keygen](http://en.wikipedia.org/wiki/Ssh-keygen) 生成的默认公钥文件名。|
|*私钥文件*|如果*身份验证方法*为“公钥”，则为私钥的文件名。必填。|示例：*id\_rsa* - 默认私钥文件名。|
|*密码*或<br>*密钥密码*|用于身份验证的密码（最多 255 个字符）或<br>密码**如果**用于私钥。|如果未使用密码，请将*密钥密码*字段留空。<br>另请参阅有关密码用法的[已知问题](/manual/installation/known_issues#ssh_checks)。|
|*执行的脚本*|使用 SSH 远程会话执行的 shell 命令。|执行的 shell 命令的返回值限制为 16MB（包括被截断的尾随空格）；[数据库限制](/manual/config/items/item#text-data-limits) 同样适用。<br><br>请注意，libssh2 库可能会将可执行脚本截断为 \~32kB。<br><br>示例：<br>*date +%s*<br>*service mysql-server status*<br>*ps auxww \| grep httpd \| wc -l*|

[comment]: # ({/e6ddb211-fe23daa8})
