mySQL连接字符串通过SSH隧道没有密码

时间:2013-08-28 22:00:40

标签: c# mysql ssh connection-string

我获得了对运行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部分,并在设置隧道时使用断点,我可以telnet到localhost:3306并从mySQL获得响应。

但是,connection.Open()行引发了以下错误:

  

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

现在成功了。

两个经验教训:

  • 如果mySQL不需要密码,则允许省略密码。
  • mySQL的错误消息可能更明确。