1

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

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

到目前为止,我的粗略代码使用MySql.Dataand SSH.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'的访问被拒绝(使用密码:是)

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

4

2 回答 2

0

如果他们从错误的主机连接,MySQL 能够拒绝登录。也许您不允许 ubuntu 从本地主机连接?

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

于 2013-08-29T08:27:09.383 回答
0

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

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

现在成功了。

吸取的两个教训:

  • 如果 mySQL 不需要密码,则可以省略密码。
  • mySQL 的错误消息可能更明确。
于 2013-08-29T10:14:00.857 回答