none
Пример работы SSH тунеля в C# RRS feed

  • Вопрос

  • подскажите простой готовый пример подключения к MySQL используя SSH тунель в C#....

    Пример моего кода...

    private void Form3_Load(object sender, EventArgs e)
            {
                Session session;
                MySqlConnection conn = null;
    
                try
                {
                    //Create a new JSch instance
                    JSch jsch = new JSch();//Create a new SSH session
                    string host = "ip адрес сервера"; //url
                    string user = "user"; //ssh username
                    string pass = "password"; //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, "ip адрес сервера", rPort);
    
                    if (session.isConnected())
                    {
                        try
                        {
                            string dbhost = "localhost";
                            string dbuser = "user";
                            string dbpass = "password";
                            string dbdatabase = "dbname";
                            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)
                        {
                            richTextBox1.Text = ex.Message + " - 1";
                            session.disconnect();
                        }
                        finally
                        {
                            conn.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    richTextBox1.Text = ex.Message + " - 2";
                }
            }
    Но вот что не понятно. Логин и пароль пользователя указывать те которые используются для подключения к Базе Данных или данные для входа в аккаунт хостинга... И как после успешного соединения выполнить sql запрос...

    26 января 2015 г. 15:20

Ответы

  • Ну вот мой кусок кода, постараюсь изменить, чтоб было понятней, плюс комментарии допишу, надеюсь он останется работоспособным после этого... :-)

    public async Task<string> Zapros(string UrlPhp, string _Login, string _Passw, string _SQLzapros)
    {
     string content = "Param1={0}&Param2={1}&Param3={2}";
     try
     {
      //создание запроса
      var request = (HttpWebRequest)WebRequest.Create(UrlPhp);
      request.Proxy = HttpWebRequest.DefaultWebProxy;
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      string data = string.Format(_Login, _Passw, _SQLzapros);
      byte[] notificationMessage = Encoding.UTF8.GetBytes(data);
      //добавление в запрос тела заголовка
      using (Stream requestStream = await request.GetRequestStreamAsync())
      { requestStream.Write(notificationMessage, 0, notificationMessage.Length); }
      //отправка запроса
      var response = await request.GetResponseAsync();
      //чтение ответа PHP 
      using (Stream responseStream = response.GetResponseStream())
      {
       var streamReader = new StreamReader(responseStream);
       return streamReader.ReadToEnd();
      }
     }
    catch (Exception ex)
     { }
    }

    Это c#... А на PHP тут уж ваш полет фантазий, но базовые операторы приблизительно следующие:

    <?php
    
    $Pr1=str_replace("\'", "'", $_REQUEST["Param1"]);
    $Pr1=str_replace('\"', '"', $Pr1);
    $Pr2=str_replace("\'", "'", $_REQUEST["Param2"]);
    $Pr2=str_replace('\"', '"', $Pr2);
    $Pr3=str_replace("\'", "'", $_REQUEST["Param3"]);
    $Pr3=str_replace('\"', '"', $Pr3);
    
    $dbhost = "localhost"; 
    $dbname =  "DemoMySQLBase"; 
    $dbuser =  $Pr1;
    $dbpasswd = $Pr2; 
    
    $dbcnx = @mysql_connect($dbhost, $dbuser, $dbpasswd);
    if (!$dbcnx) { echo('No connect server'); exit; }
    if (!@mysql_select_db($dbname,  $dbcnx)) 
    { echo('No connect base'); exit; }
    
    $sqlt = mysql_query($Pr3);
    
    ... обработка результатов $sqlt для возврата ...
    
    php?>
    Вот что-то типа такого использую


    • Изменено Liliya Muray 27 января 2015 г. 13:22
    • Помечено в качестве ответа motokraft 28 января 2015 г. 9:19
    27 января 2015 г. 13:18

Все ответы

  • Я тоже когда-то искала, как получить данные из MySQL с сервера, запрещающего прямое подключение к базе данных. В моем понимании отложилось, что SSH очень капризен к обрывам связи и низкому качеству интернета. Но мне предложили следующий вариант: Пишите все необходимые запросы к базе на PHP, а уже из c# делаете POST запрос к вашей PHP странице. Может и вам подойдет данный вариант.
    26 января 2015 г. 17:07
  • Расскажите пожалуйста про этот способ, хорошо будет если еще и примерчик есть...

    Честно говоря мне не важно как мне подключаться к БД, главное это сделать...

    • Изменено motokraft 26 января 2015 г. 23:24
    26 января 2015 г. 23:21
  • А я уже написала все ранее. Написать php, к ней в POST параметрах передавать необходимые ключи (логины, пароли, SQL запросы к базе или коды запросов, для уменьшения трафика), а результат уже парсить в c#. Вам примеры чего? Как на PHP отправить запрос к базе данных? Или на c# отправить POST запрос к сайту? Этих примеров море, но каждый затачивает под свои нужды. Я знаю, что работаю с простыми данными и результат запроса формирую в виде текстового файла, а есть вариант, что PHP результат от базы вернет в виде XML файла. Я не захотела XML, так как он раздут служебной информацией, без которой я могу обойтись. Вообщем решать вам, как организовывать данные в PHP, вам их потом парсить в c#...
    27 января 2015 г. 6:59
  • на c# отправить POST запрос к сайту?

    Вот как раз вот это хотелось бы примерчик посмотреть... И с чего начать стоить систему. Для начала попробовать с формой входа в приложении. А дальше потом разберемся... 

    Конечно сначала бы понять всю эту систему, но на данный момент есть такие вопросы которые вообще не понятны...

    27 января 2015 г. 11:24
  • Ну вот мой кусок кода, постараюсь изменить, чтоб было понятней, плюс комментарии допишу, надеюсь он останется работоспособным после этого... :-)

    public async Task<string> Zapros(string UrlPhp, string _Login, string _Passw, string _SQLzapros)
    {
     string content = "Param1={0}&Param2={1}&Param3={2}";
     try
     {
      //создание запроса
      var request = (HttpWebRequest)WebRequest.Create(UrlPhp);
      request.Proxy = HttpWebRequest.DefaultWebProxy;
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      string data = string.Format(_Login, _Passw, _SQLzapros);
      byte[] notificationMessage = Encoding.UTF8.GetBytes(data);
      //добавление в запрос тела заголовка
      using (Stream requestStream = await request.GetRequestStreamAsync())
      { requestStream.Write(notificationMessage, 0, notificationMessage.Length); }
      //отправка запроса
      var response = await request.GetResponseAsync();
      //чтение ответа PHP 
      using (Stream responseStream = response.GetResponseStream())
      {
       var streamReader = new StreamReader(responseStream);
       return streamReader.ReadToEnd();
      }
     }
    catch (Exception ex)
     { }
    }

    Это c#... А на PHP тут уж ваш полет фантазий, но базовые операторы приблизительно следующие:

    <?php
    
    $Pr1=str_replace("\'", "'", $_REQUEST["Param1"]);
    $Pr1=str_replace('\"', '"', $Pr1);
    $Pr2=str_replace("\'", "'", $_REQUEST["Param2"]);
    $Pr2=str_replace('\"', '"', $Pr2);
    $Pr3=str_replace("\'", "'", $_REQUEST["Param3"]);
    $Pr3=str_replace('\"', '"', $Pr3);
    
    $dbhost = "localhost"; 
    $dbname =  "DemoMySQLBase"; 
    $dbuser =  $Pr1;
    $dbpasswd = $Pr2; 
    
    $dbcnx = @mysql_connect($dbhost, $dbuser, $dbpasswd);
    if (!$dbcnx) { echo('No connect server'); exit; }
    if (!@mysql_select_db($dbname,  $dbcnx)) 
    { echo('No connect base'); exit; }
    
    $sqlt = mysql_query($Pr3);
    
    ... обработка результатов $sqlt для возврата ...
    
    php?>
    Вот что-то типа такого использую


    • Изменено Liliya Muray 27 января 2015 г. 13:22
    • Помечено в качестве ответа motokraft 28 января 2015 г. 9:19
    27 января 2015 г. 13:18
  • Я тут пробовал, но вот в чем проблема... В переменной ответа от сервера содержится вся страница, в вашем случае это будет No connect server или No connect base

    Может ли быть POST данные массивом в котором находиться разные данные...

    27 января 2015 г. 13:48
  • Верно. Дальше полет вашей фантазии...

    $sqlt = mysql_query($xxlq);
     if ($sqlt)
     {... формируете ответ в случае, если SQL выполнился удачно ...}

    P.S. mysql_fetch_array($sqlt) - это данные в виде массива...
    • Изменено Liliya Muray 27 января 2015 г. 13:59
    27 января 2015 г. 13:57
  • P.S. mysql_fetch_array($sqlt) - это данные в виде массива...

    ну так как мне вывести от сюда данные в C#

    В PHP я знаю...

    $set = mysql_fetch_array($sqlt);

    echo $set->name;

    Но как это сделать в C#...

    27 января 2015 г. 14:12
  • Вы правильно заметили, что результатом выполнения php, является страница, как вы могли заметить, процедура возвращает тип стринг, который вы потом обрабатываете по своему усмотрению. Т.е. парсинг страницы уже индивидуально для каждого проекта.
    27 января 2015 г. 14:19
  • не совсем понял что вы имели ввиду!!!!
    27 января 2015 г. 14:33
  • допустим мы выполнили запрос типа "select id, name, pol from pers", а результат сделали страницу:

    1;Вася;М

    2;Валя;Ж

    3;Петя;М

    Читаем страницу построчно, парсим каждую строку и раскидываем по нужным местам полученные значения.

    27 января 2015 г. 14:38
  • Это можно сделать...

    Хотел спросить про работу с классами 

    Обрабатывать полученные данные от сервера в одном классе

    могу ли я вывести их массивом... и Использовать во всей форме....

    К примеру приведу код php

    public static function getUserInfo ( $referrerid='', $userid='' ) {

    здесь полный код работы с данными

    выводим все в массив...

    return @$userinfo[0]; }

    можно ли так сделать в C#

    27 января 2015 г. 14:52
  • Как захотите. Создадите массив или просто класс, видимость класса и массива в одной форме или во всем проекте, вам решать...
    27 января 2015 г. 16:13
  • Если хочу использовать во всей форме, это мне надо сделать публичную переменную sting. Так..
    27 января 2015 г. 23:22
  • Я на c# под WinRT пишу и делаю это совсем не долго. Public - это доступность из вне. А уровень доступа это где вы опишите переменную. Я не эксперт и поэтому не могу ошибаться... Раньше писала на Delphi...

    P.S. Как тут пишут именитые помощники, если вам помог мог ответ, то пометьте его галочкой или проголосуйте за него...

    28 января 2015 г. 7:33