Metrika

27 января 2011 г.

Доступ к MySQL через SSH-туннель в .NET

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

3 комментария :

  1. не работает ссылка

    ОтветитьУдалить
    Ответы
    1. Ага. Позже посмотрю как я это делал, если найду, распишу тут

      Удалить
    2. Обновил статью. Дал ссылки на саму библиотеку и дал пример кода.

      Удалить