2013-08-28 83 views
1

我已經給運行mySQL的服務器提供SSH訪問。我的訪問通過我的公鑰進行驗證,不需要其他密碼。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()行:

認證主辦的「localhost」用戶「Ubuntu的」使用方法「mysql_native_password」失敗消息:拒絕訪問用戶「Ubuntu的」 @ 'localhost'(使用密碼:YES)

那麼......我需要什麼連接字符串?或者我錯過了其他地方微妙的東西?

回答

0

原來,這個問題是相關的SSH隧道本身;改爲使用Putty創建隧道,並刪除在該行之前運行的所有代碼:

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

現在成功。

兩個經驗教訓:

  • 如果MySQL並不需要一個能允許省略密碼。
  • mySQL的錯誤消息可以做更明確的。
0

如果從錯誤的主機連接,MySQL可以拒絕登錄。也許你不允許ubuntu從本地主機連接?

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

+0

使用SSH隧道,哪個服務器連接似乎來自 - 不會在服務器上sshd使它們看起來來自本地主機? –

+0

我不知道,但看着錯誤,我*認爲*它。你可以使用命令行登錄到mysql mysql正在使用相同的憑據運行嗎? :mysql --host = localhost --user = ubuntu – Jaco

+0

我剛剛嘗試過,是的,它確實給了我訪問權限。 –