Соединение с mysql через туннель SSH используя php

534
25 февраля 2017, 07:14

Доброго времени суток. Возникла следующая загвоздка:

Использую для работы windows с установленным WAMP. Поставщик услуг хостинга позволяет подключаться к бд только по SSH2 (оно и правильно), вот только подключиться к базе не удаётся. Делаю следующее

$ssh_server='93.125.xx.xx'; //адрес сервера
$ssh_port='22'; //порт сервера
$ssh_user=''; //логин от сервера
$ssh_password=''; //пароль от сервера
$ssh_connection=ssh2_connect($ssh_server, $ssh_port);
$ssh_auth=ssh2_auth_password($ssh_connection, $ssh_user, $ssh_password);
$ssh_tunnel = ssh2_tunnel($ssh_connection, $ssh_server, $ssh_port);

Тут всё проходит на ура. Дальше проверяю и пробую подключиться к БД. Но так и не понял, как используя туннель созданный подключаться

if ($ssh_connection and $ssh_auth and $ssh_tunnel) {
    $db_hostname = '127.0.0.1';
    $db_database = ''; //имя БД mysql
    $db_username = ''; //имя пользоватля БД
    $db_password = ''; //пароль пользователя БД
    $db_port = '3306';
    $connection_mysql = new mysqli($db_hostname, $db_username, $db_password, $db_database, $db_port);
    if ($connection_mysql->connect_error) exit($connection_mysql->connect_error);
    mysqli_set_charset($connection_mysql, "utf8"); 
}

Выдаёт ошибку подключения стандартную

Access denied for user 'igcby_gpresults'@'localhost' (using password: YES)

Но судя по всему он коннектится просто к моей локальной базе данных, а у меня на машине такой нет.

Если же попробовать подставить в качестве $db_hostname переменные ssh, то тоже ничего путёвого не выходит. Для переменных $ssh_connection, $ssh_auth, $ssh_tunnel выдаёт, соответственно:

mysqli::__construct() expects parameter 1 to be string, resource given

mysqli::__construct(): php_network_getaddresses: getaddrinfo failed

mysqli::__construct() expects parameter 1 to be string, resource given

var_dump трёх переменных ssh

var_dump($ssh_connection);
var_dump($ssh_auth);
var_dump($ssh_tunnel);

выдаёт следующее

resource(2) of type (SSH2 Session)

bool(true)

resource(3) of type (stream)

Если же в качестве $db_hostname указывать непосредственно сам адрес сервера, как при подключении по ssh ($ssh_server='93.125.xx.xx'; и сделать также $db_hostname='93.125.xx.xx';), то толку тоже не будет (mysqli::__construct(): (HY000/2002): и куча ромбов с вопросами - что-то с кодировкой)

Как быть, подскажите, пожалуйста.

Answer 1

Если я правильно понял то надо так:

  1. Создать туннель.
  2. Сделать порт forwarding с удаленной машины на локальную.
  3. Запросы делать к локальному порту.

Простой вариант(для линукса):

<?php
    shell_exec(“ssh -f -L 3307:127.0.0.1:3306 user@remote_server sleep 60 >> logfile”);
    $db = mysqli_connect(‘127.0.0.1’, ‘sqluser’, ‘sqlpassword’, ‘database’, 3307);

Взят отсюда https://blog.rjmetrics.com/2009/01/06/php-mysql-and-ssh-tunneling-port-forwarding/

Не уверен как оно будет работать с ssh2 И если верить http://stackoverflow.com/questions/309615/connect-to-a-mysql-server-over-ssh-in-php то, ни как не будет.

Ну и страница проекта утверждает что библиотека не стабильна...

Как вариант для пользователя windows. Создайте туннель в putty.

http://www.akadia.com/services/ssh_putty.html

Привяжите на локальный порт 3037

А ваш код прост станет:

<?php
    $db = mysqli_connect(‘127.0.0.1’, ‘sqluser’, ‘sqlpassword’, ‘database’, 3307);

У putty есть интерфейс через командную строку нак что вполне можно использовать shell_exec.

У меня один вопрос, зачем вам это? Зачем с локального компьютера к базе удаленной подключаться?

Answer 2

попробуйте $connection_mysql = new mysqli($db_hostname, $db_username, $db_password, $db_database, $db_port, $ssh_tunnel);

READ ALSO
Консольная команда из php скрипта

Консольная команда из php скрипта

Разбираюсь с CentOS, вопрос такойУ меня проект написаный на php, по логике которого мне нужно автоматизировать делать некоторые действия командной...

327
Не находит элемент массива

Не находит элемент массива

Добрый день, ребятЕсть массив, назовем его UserArticleList, вот его вардамп:

244
не работает controller в Angularjs

не работает controller в Angularjs

В приложении вызываю окно отправки формы, пытаюсь передать в нее контроллер, но он не передается, в чем ошибка?

420
Как исправить скрипт на JS?

Как исправить скрипт на JS?

Есть скрипт помогающий оформить код при редактировании https://jsfiddlenet/L5qhzdh7/

308