MySQL Shell 8.4  /  ...  /  使用 SSH 隧道

4.3.6 使用 SSH 隧道

MySQL Shell 支持 SSH 隧道连接到 MySQL 服务器实例。SSH 隧道允许未加密的流量通过加密连接传递,并允许授权远程访问受防火墙保护的服务器,这些服务器不受外部连接的保护。

不建议通过使用 SSH 隧道的 MySQL Shell 建立连接使用 AdminAPI 命令,但以下命令除外:用于部署、启动、停止、杀死和删除沙箱实例的命令(dba.deploySandboxInstancedba.startSandboxInstancedba.stopSandboxInstancedba.killSandboxInstancedba.deleteSandboxInstance)。沙箱命令始终在本地执行到 MySQL Shell 实例。

建立 SSH 隧道后,可以从同一个远程服务器实例连接的同一个用户共享到同一主机的连接。MySQL Shell 函数 shell.listSshConnections() 列出当前连接的活动 SSH 隧道,以及 SSH 服务器和连接的 MySQL 服务器实例的 URI。如果您指定相同的 SSH 连接详细信息,MySQL Shell 会自动重用现有隧道。

您可以选择用于连接的 SSH 配置文件和身份文件(私钥)。设置 SSH 隧道时,MySQL Shell 会按以下优先级顺序选择 SSH 配置文件

  1. 您作为连接选项指定的 SSH 配置文件。

  2. 您使用 MySQL Shell 配置选项 ssh.configFile 设置为默认的 SSH 配置文件。有关设置此选项的说明,请参阅 第 13.4 节“配置 MySQL Shell 选项”

  3. 标准 SSH 配置文件 ~/.ssh/config

已知主机文件从默认位置 (~/.ssh/known_hosts) 读取,除非 SSH 配置文件中设置了不同的配置。

对于身份文件(私钥),您可以在连接时使用 ssh-identity-file 选项指定自定义文件。没有选项可以设置身份文件的自定义默认值。如果您没有指定一个,SSH 库将使用以下身份验证尝试序列,直到其中一个成功

  1. 如果 SSH 代理正在使用,则会尝试使用那里配置的身份文件进行身份验证(如果可用)。

  2. 如果 SSH 配置文件中为目标主机指定了身份文件,则会尝试使用该文件进行身份验证。

  3. 如果这两个选项都不可用或身份验证尝试失败,则会尝试使用 SSH 配置文件夹中的标准私钥文件 (~/.ssh/id_rsa) 进行身份验证。

通过 SSH 隧道传输数据的默认缓冲区大小为 10240 字节。您可以通过设置 MySQL Shell 配置选项 ssh.bufferSize 来更改此大小。有关设置此选项的说明,请参阅 第 13.4 节“配置 MySQL Shell 选项”

当您使用任何 MySQL Shell 连接方法时,SSH 隧道都可用 - shell.connect() 方法、mysqlsh 命令参数或 \connect MySQL Shell 命令。

shell.connect()

当您在 MySQL Shell 运行时使用 shell.connect() 方法进行连接时,您可以指定连接到 SSH 服务器的 URI,或使用键值对来表示连接数据。此方法可以使用以下选项

  • ssh: 连接到 SSH 服务器的 URI。URI 格式为 [user@]host[:port]

  • uri: 要通过 SSH 隧道访问的 MySQL 服务器实例的 URI。URI 格式为 [scheme://] [user@]host:port。不要使用基本连接参数 (schemeuserhostport) 为 SSH 隧道指定 MySQL 服务器连接,只需使用此选项即可。必须指定端口。

  • ssh-password: 连接到 SSH 服务器的密码。

  • ssh-config-file: 连接到 SSH 服务器的 SSH 配置文件。

  • ssh-identity-file: 用于连接到 SSH 服务器的身份文件。

  • ssh-identity-pass: ssh-identity-file 选项指定的身份文件的密码短语。

当您使用 shell.openSession() 方法时,这些选项也可用,该方法的工作方式与 shell.connect() 相同,但会创建并返回一个 session 对象,而不是将其设置为 MySQL Shell 的全局会话。有关使用此连接方法和其他可用选项的完整说明,请参阅 使用 URI 样式字符串或键值对连接到服务器

mysqlsh 命令参数

当您在 MySQL 启动时使用命令行选项进行连接时,您可以指定连接到 SSH 服务器的 URI。此方法可以使用以下选项

  • --ssh: 连接到 SSH 服务器的 URI。URI 格式为 [user@]host[:port]。当您使用此选项时,必须在 MySQL 实例 URI 中指定连接到 MySQL 服务器实例的端口。

  • --ssh-config-file: 连接到 SSH 服务器的 SSH 配置文件。如果您使用空值指定此选项,则会忽略由 --ssh.configFile 指定的自定义默认 SSH 配置文件,并使用 ~/.ssh/config 文件。

  • --ssh-identity-file: 用于连接到 SSH 服务器的身份文件。

有关使用此连接方法和其他可用选项的完整说明,请参阅 第 4.3.1 节“使用单个参数连接”

\connect MySQL Shell 命令

当您在 MySQL Shell 运行时使用 \connect 命令进行连接时,您可以指定连接到 SSH 服务器的 URI。SSH 连接没有其他选项,因此您必须使用默认身份文件 ~/.ssh/id_rsa 和默认 SSH 配置文件,该文件可以是标准文件 ~/.ssh/config 或您使用 MySQL Shell 配置选项 ssh.configFile 设置的自定义默认值(请参阅 第 13.4 节“配置 MySQL Shell 选项”)。

要获取其他设置选项,您可以使用 shell.connect() 方法或在 MySQL Shell 启动时在命令行上创建 SSH 隧道,然后使用 \connect 命令重复使用它。当您处于 MySQL Shell 会话中时,可以使用 shell.listSshConnections() 命令查看当前连接的 SSH 隧道。

MySQL Shell 的秘密存储库可以存储连接到 SSH 服务器和身份文件的密码和密码短语,以便在将来连接时自动检索。如果您在连接选项中提供密码或密码短语,则会使用它,而不是秘密存储库中存储的任何密码。请注意,尽管存在允许它的选项,但在连接数据中指定显式密码是不安全的,不建议这样做。MySQL Shell 在需要时会交互式地提示您输入密码,无论是用于连接到 SSH 服务器还是用于身份文件。例如

mysql-js> shell.connect({uri:"mysql://root:[email protected]:3306",
        > ssh:"[email protected]:2222", "ssh-identity-file":"/home/hanna/.ssh/config_pw"})
Creating a Classic session to '[email protected]:3306'
Opening SSH tunnel to 198.51.100.4:2222...
Please provide key passphrase for /home/hanna/.ssh/config_pw: ********
Save password for 'file:/home/hanna/.ssh/config_pw'? 
[Y]es/[N]o/Ne[v]er (default No): y
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 7869
Server version: 8.0.28 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:[email protected]:3306>