Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

使用 PTY 的 SSH 接口

Experimental 功能
ClickHouse Cloud 不支持此功能

前言

ClickHouse 服务器 支持通过 SSH 协议直接连接到自身。可使用任意客户端。

创建使用 SSH 密钥标识的数据库用户后:

CREATE USER abcuser IDENTIFIED WITH ssh_key BY KEY '<REDACTED>' TYPE 'ssh-ed25519';

你可以使用此密钥连接到 ClickHouse 服务器。系统会打开一个伪终端 (PTY) ,并启动 clickhouse-client 的交互式会话。

> ssh -i ~/test_ssh/id_ed25519 abcuser@localhost -p 9022
ClickHouse embedded version 25.1.1.1.

ip-10-1-13-116.us-west-2.compute.internal :) SELECT 1;

SELECT 1

Query id: cdd91b7f-215b-4537-b7df-86d19bf63f64

   ┌─1─┐
1. 1
   └───┘

1 row in set. Elapsed: 0.002 sec.

也支持通过 SSH 执行命令 (非交互模式) :

> ssh -i ~/test_ssh/id_ed25519 abcuser@localhost -p 9022 "select 1"
1

服务器配置

要启用 SSH 服务器功能,您需要在 config.xml 中取消注释或添加以下部分:

<tcp_ssh_port>9022</tcp_ssh_port>
<ssh_server>
   <host_rsa_key>path-to-the-key</host_rsa_key>
   <!--host_ecdsa_key>path-to-the-key</host_ecdsa_key-->
   <!--host_ed25519_key>path-to-the-key</host_ed25519_key-->
</ssh_server>

主机密钥是 SSH 协议的重要组成部分。该密钥的公钥部分会存储在客户端的 ~/.ssh/known_hosts 文件中,通常用于防范中间人攻击。首次连接到服务器时,您会看到如下消息:

The authenticity of host '[localhost]:9022 ([127.0.0.1]:9022)' can't be established.
RSA key fingerprint is SHA256:3qxVlJKMr/PEKw/hfeg06HAK451Tt0eenhwqQvh58Do.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这实际上意味着:"您是否要记住此主机的公钥并继续连接?"。

您可以通过传递一个选项,告诉 SSH 客户端不要验证该主机:

ssh -o "StrictHostKeyChecking no" user@host

配置嵌入式客户端

您可以像使用普通 clickhouse-client 一样为嵌入式客户端传递选项,但会有一些限制。 由于这里使用的是 SSH 协议,向目标主机传递参数的唯一方式是通过环境变量。

例如,可按如下方式设置 format

> ssh -o SetEnv="format=Pretty" -i ~/test_ssh/id_ed25519  abcuser@localhost -p 9022 "SELECT 1"
   ┏━━━┓
 1
   ┡━━━┩
1. 1
   └───┘

你可以通过这种方式更改任何用户级设置,还可以额外传递大多数常规的 clickhouse-client 选项 (但不包括在这种场景下无意义的选项。)

重要:

如果同时传入了 query 选项和 SSH 命令,后者会被添加到待执行的查询列表中:

ubuntu ip-10-1-13-116@~$ ssh -o SetEnv="format=Pretty query=\"SELECT 2;\"" -i ~/test_ssh/id_ed25519  abcuser@localhost -p 9022 "SELECT 1"
   ┏━━━┓
 2
   ┡━━━┩
1. 2
   └───┘
   ┏━━━┓
 1
   ┡━━━┩
1. 1
   └───┘
Navigation