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

4.3.6 使用 SSH 隧道

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

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

建立 SSH 隧道后,可以从同一远程服务器实例连接的同一用户共享到同一主机的连接。MySQL Shell 函数 shell.listSshConnections() 列出了来自 MySQL Shell 会话的当前连接的活动 SSH 隧道,包括 SSH 服务器的 URI 和连接的 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 连接方法(shell.connect() 方法、mysqlsh 命令参数或 \connect MySQL Shell 命令)时,都提供 SSH 隧道。

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>