開始
最近在做一個項目需要用到ssh去連接mysql數據庫,踩了不少坑,今日發博記錄下。
正文
直接上代碼。
//ssh配置 var sshHost = "sshhost"; var sshUser = "root"; var sshPwd = "sshPassword"; var sshPort = 22; //數據庫連接 var server = "數據庫server"; var database = "數據庫名稱"; var user = "數據庫用戶名"; uint dbPort = 33306; var dbPwd = "密碼"; //mysqlbuilder方式便於后續參數變更 MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder(); connBuilder.AllowBatch = true; connBuilder.Server = server; connBuilder.Port = 3306;//初始化默認 connBuilder.UserID = user; connBuilder.Password = dbPwd; connBuilder.Database = database; //ssh連接信息 var auth = new PasswordAuthenticationMethod(sshUser, sshPwd); ConnectionInfo conInfo = new ConnectionInfo(sshHost, sshPort, sshUser, auth); try { //ssh客戶端,用using便於資源釋放 using (SshClient client = new SshClient(conInfo)) { //獲取本機ip環回地址 一般是127.0.0.1 var local = IPAddress.Loopback.ToString(); //端口轉發 /* *lcoal 本地綁定ip *dbPort 本地綁定端口 *server 數據庫server *3306 服務器上數據庫的端口可能不是3306 * */ ForwardedPortLocal port = new ForwardedPortLocal(local, dbPort, server, 3306); client.Connect(); if (!client.IsConnected) { Console.WriteLine("ssh連接失敗"); } //給客戶端追加需要轉發的端口信息 client.AddForwardedPort(port); //啟動 port.Start(); /* * 重點,當我們轉發端口之后一定需要將我們轉發之后的host和port把MysqlBuilder中的Server和Port替換掉。 * 否則會報Unable to connect to any of the specified MySQL hosts. */ connBuilder.Port = port.BoundPort;//本地綁定ip connBuilder.Server = port.BoundHost;//本地綁定ip //連接字符串 MySqlConnection conn = new MySqlConnection(connBuilder.ConnectionString); conn.Open(); } } catch (Exception ex) { Console.WriteLine(ex.Message); }
結語
這個還是需要細心去注意每個參數的賦值,要不然錯誤很難找出來,特別是轉發端口的那段代碼真的需要好好研究。
參考連接: