Как то мне очень надо было реализовать такую возможность, вот нашел статью: 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 вроде бы описывается как с ней работать.
не работает ссылка
ОтветитьУдалитьАга. Позже посмотрю как я это делал, если найду, распишу тут
УдалитьОбновил статью. Дал ссылки на саму библиотеку и дал пример кода.
Удалить