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

Posted

技术标签:

【中文标题】通过 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 连接字符串,无需密码的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 C# 建立 MySQL 连接的 SSH 隧道

mysql 无法连接 SSH 隧道 -> 拒绝访问“无”

通过ssh隧道访问mysql时如何配置mybatis属性

EXCEL的VBA通过SSH连接MYSQL

通过 ssh 迁移工作台 - 如何设置隧道