Как то мне очень надо было реализовать такую возможность, вот нашел статью: Access MySQL Through SSH Tunnel in a Windows .NET Application, к сожалению ссылка перестала работать, поэтому пришлось поискать в своем старом коде.
Я его давно не запускал, но, думаю, он направит в нужном направлении. Для работы нужна библиотека: http://www.tamirgal.com/blog/page/SharpSSH.aspx , там можно качнуть ее в исходниках или в бинарниках. Ссылки в глаза не бросаются, поэтому даю тут ссылку на бинарник: SharpSSH-1.1.1.13.bin.zip
Далее привожу код консольного приложения, которое соединяется с MySQL через SSH-тунель:
using System; using System.Collections.Generic; using System.Text; using Tamir.SharpSsh.jsch; using MySql.Data.MySqlClient; namespace TestSSHTunnel { class Program { static void Main(string[] args) { Session session; MySqlConnection conn = null; try { //Create a new JSch instance JSch jsch = new JSch();//Create a new SSH session string host = "u196.ssh.masterhost.ru"; //url string user = "ssh_user"; //ssh username string pass = "ssh_pswd"; //ssh password int sshPort = 22; //ssh port int rPort = 3306; int lPort = 3306; session = jsch.getSession(user, host, sshPort); session.setHost(host); session.setPassword(pass); UserInfo ui = new MyUserInfo(); session.setUserInfo(ui); session.connect(); // Set port forwarding on the opened session session.setPortForwardingL(lPort, "u196.mysql.masterhost.ru", rPort); if (session.isConnected()) { try { string dbhost = "localhost"; string dbuser = "db_user"; string dbpass = "db_pswd"; string dbdatabase = "db_name"; string connStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false", dbhost, dbuser, dbpass, dbdatabase); // Create a MySql Connection conn = new MySqlConnection(connStr); conn.Open(); conn.ChangeDatabase(dbdatabase); } catch (Exception ex) { Console.WriteLine(ex.Message); session.disconnect(); } finally { conn.Close(); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } public class MyUserInfo : UserInfo { ////// Holds the user password /// private String passwd; ////// Returns the user password /// public String getPassword() { return passwd; } ////// Prompt the user for a Yes/No input /// /// ///public bool promptYesNo(String str) { return true; } /// /// Returns the user passphrase (passwd for the private key file) /// ///public String getPassphrase() { return null; } /// /// Prompt the user for a passphrase (passwd for the private key file) /// /// ///public bool promptPassphrase(String message) { return true; } /// /// Prompt the user for a password /// /// ///public bool promptPassword(String message) { return true; } /// /// Shows a message to the user /// /// public void showMessage(String message) { } } }
Еще тогда, когда мне нужно было решить эту проблему, я нашел библиотеку http://granados.sourceforge.net/ , но по каким-то причинам от нее отказался. Тут http://social.msdn.microsoft.com/Forums/en-US/e554ebc5-7b74-415f-8ac8-d5dc3dcaf1c5/looking-for-granados-ssh-example?forum=netfxnetcom вроде бы описывается как с ней работать.
не работает ссылка
ОтветитьУдалитьАга. Позже посмотрю как я это делал, если найду, распишу тут
УдалитьОбновил статью. Дал ссылки на саму библиотеку и дал пример кода.
Удалить