怎么通过SSH连接Mysql数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么通过SSH连接Mysql数据库相关的知识,希望对你有一定的参考价值。

参考技术A 在这里小编使用的是SQLyogEnt进行远程连接配置了SSH的数据库。通过桌面的SQLyogEnt运行数据库客户端。

在界面中点击【新建】按钮,在mysql下填写Mysql数据库的ip地址、用户名、密码、端口(默认在3306)就好,数据库名称。这里跟普通的连接数据库的方法一致。

这个时候读者可以点击一下【测试连接】,这个时候点击测试连接去连接数据库是不会成功的,因为数据库配置了SSH访问。如下图:

配置完成Mysql信息后,在旁边选择【SSH】

点击SSH后会弹出一个提示框,点击提示框的【确定】按钮。

点击后勾选“使用SSH隧道”

勾选后下方的配置信息由勾选前的灰色变更为白色可输入状态,在这里配置访问的SSH主机地址、用户名、密码或者公共密匙。

配置完成后来测试配置连接是否正确,点击【测试连接】由于已经配置了正确的SSH访问,这次测试连接成功了。

9
最后就可以点击界面下方的【连接】按钮,连接上数据库,进行操作了。

通过 SSH 隧道的 mySQL 连接字符串,无需密码

【中文标题】通过 SSH 隧道的 mySQL 连接字符串,无需密码【英文标题】:mySQL connection string through SSH tunnel without password 【发布时间】:2013-09-01 04:17:58 【问题描述】:

我已获得对运行 mySQL 的服务器的 SSH 访问权限。我的访问权限通过我的公钥进行验证,无需其他密码。

使用 Putty,我可以使用我的私钥通过 SSH 连接到服务器,通过命令行工具直接登录到 mySQL 数据库并直接运行 SQL。我希望通过 C# 服务来模拟这一点(通过 SSH 连接转发端口 3306),不幸的是,http://www.connectionstrings.com/mysql/ 中列出的所有连接字符串都需要密码。

到目前为止,我使用 MySql.DataSSH.NET 的粗略代码:

  PrivateKeyFile file = new PrivateKeyFile(@" [ path to private key ]");
  using (var client = new SshClient(" [ server ] ", "ubuntu", file))
  

      var port = new ForwardedPortLocal(3306, "localhost", 3306);
      client.AddForwardedPort (port);
      client.Connect();

      var connection = new MySqlConnection(
           "server=localhost;database=[database];uid=ubuntu;"
      );
      MySqlCommand command = connection.CreateCommand();
      MySqlDataReader Reader;
      command.CommandText = "select * from sample";
      connection.Open();
      Reader = command.ExecuteReader();
      while (Reader.Read())
      
          string thisrow = "";
          for (int i = 0; i < Reader.FieldCount; i++)
              thisrow += Reader.GetValue(i).ToString() + ",";
          Console.Write(thisrow);
      
      connection.Close();
      client.Disconnect();
 

在没有SshClient 部分的情况下运行代码,与本地网络上的数据库(使用已知的用户名和密码)通信,运行良好。加入SshClient 部分,并在设置隧道后设置断点后,我可以远程登录到localhost:3306 并从mySQL 获得响应。

但是,connection.Open() 行会抛出以下错误:

使用方法“mysql_native_password”对用户“ubuntu”的主机“localhost”进行身份验证失败,并显示消息:用户“ubuntu”@“localhost”的访问被拒绝(使用密码:YES)

那么...我需要什么连接字符串?还是我错过了其他地方的一些微妙之处?

【问题讨论】:

【参考方案1】:

如果从错误的主机连接,MySQL 可以拒绝登录。也许你不允许 ubuntu 从 localhost 连接?

https://dev.mysql.com/doc/refman/5.1/en/connection-access.html

【讨论】:

使用 SSH 隧道,连接似乎来自哪个服务器 - 服务器上的 sshd 不会使它们看起来来自本地主机吗? 我不确定,但看看错误,我假设确实如此。您可以在使用相同凭据运行 mysql 的机器上使用命令行登录 mysql 吗? : mysql --host=localhost --user=ubuntu 那么它可能是别的东西。由于错误,这对我来说似乎是最合乎逻辑的。目前我想不出另一种解决方案。对不起。 没问题,感谢收看。我现在看到 ssh 隧道本身是否可能是问题所在。【参考方案2】:

问题原来与 SSH 隧道本身有关;使用 Putty 创建隧道并删除该行之前运行的所有代码:

  var connection = new MySqlConnection(
       "server=localhost;database=[database];uid=ubuntu;"
  );

现在成功了。

吸取的两个教训:

如果 mySQL 不需要密码,则可以省略密码。 mySQL 的错误消息可以更加明确。

【讨论】:

以上是关于怎么通过SSH连接Mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

通过 ssh 连接 mysql

SSH如何连接MYSQL数据库

Windows平台使用Navicat for MySQL通过SSH密钥认证连接远程MySQL数据库

在 Netbeans 中通过 SSH 连接到 MySql db

java ssh mysql数据库连接失效,重启java工程。如何解决?

MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?