Подключение к MySQL через SSH в PHP - PullRequest
0 голосов
/ 31 августа 2018

Я знаю, что было задано так много вопросов об одной и той же вещи, но я не могу решить мою проблему.

У меня есть база данных, к которой я могу получить доступ только через PuTTY или MySQL Workbench - она ​​должна быть через SSH-соединение. Однако мне нужно иметь возможность использовать это соединение с базой данных через PHP, и я не могу заставить его работать.

Вот подробные данные для подключения (IP-адреса, имена пользователей и пароли для безопасности изменены):

> SSH Host ($ssh_host): 123.45.67.890
> SSH User ($ssh_user): ssh_user
> SSH Pass ($ssh_pass): ssh_pass
> MySQL Host ($mysql_host): 123.12.34.123
> MySQL User ($mysql_user): mysql_user
> MySQL Pass ($mysql_pass): mysql_pass
> MySQL Server Port  ($port): 3306
> Default Schema ($db): default

Когда я использую PuTTY, я подключаюсь к SSH Host, а затем запускаю следующие исполнения:

> (asks for login): ssh_user
> (asks for password): ssh_pass
> mysql -umysql_user -h123.12.34.123 -p;
> (asks for password): mysql_pass
> \u default
> *RUN SQL QUERY HERE LIKE*: DESCRIBE table;

При попытке подключиться к базе данных в PHP я испытываю трудности.

Первоначально я пытался использовать функции SSH2 в PHP:

$ssh_conn = ssh2_connect($ssh_host, $port);
if ($ssh_conn) {
    print "connection successful<br />";
} else {
    print "connection failed<br />";
    die();
}

$ssh_auth = ssh2_auth_password($ssh_conn, $ssh_user, $ssh_pass);
if ($ssh_conn) {
    print "authentication successful<br />";
} else {
    print "authentication failed<br />";
    die();
}

$ssh_tunnel = ssh2_tunnel($ssh_conn, $mysql_host, $port);
if ($ssh_tunnel) {
    print "tunnel successful<br />";
} else {
    print "tunnel failed<br />";
    die();
}

$mysqli = mysqli_connect($ssh_tunnel, $mysql_user, $mysql_pass, $db);
if (!$mysqli) {
    print "errno: ".mysqli_connect_errno()."<br />";
    print "error: ".mysqli_connect_error()."<br />";
    die();
} else {
    print "mysql connection successful<br />";
}

Все работает и печатает "успешно", пока я не попытаюсь использовать mysqli_connect, а затем я получу следующий ответ:

errno: 0
error: 

Файл журнала показывает:

mysqli_connect() expects parameter 1 to be string, resource given

После небольшого поиска я обнаружил, что SSH2_TUNNEL "не позволяет вам указать локальный порт при открытии туннеля SSH". Не уверен, что это вызывает проблему в моем коде, я пытаюсь перейти к другим предложениям и нашел это: http://chxo.com/be2/20040511_5667.html

Тем не менее, именно здесь я борюсь, и мне, кажется, не удается обернуть голову вокруг того, что я должен поставить вместо заполнителей:

ssh -fNg -L 3307:127.0.0.1:3306 myuser@remotehost.com

Я пробовал это, но это не работает:

ssh -fNg -L 3307:127.0.0.1:3306 ssh_user@ssh_host

Я попытался сменить локальный IP-адрес на ssh_host AND mysql_host, на всякий случай, и они тоже не сработали.

Со всеми данными, которые я привел выше, кто-то может быть настолько очевидным с тем, что мне нужно, чтобы это работало? Могу ли я сделать это исключительно с помощью функций PHP или мне нужно запускать команды?

EDIT

Согласно комментариям @LSerni, я только что попытался запустить это (замените $ vars на значения из приведенных выше):

exec("ssh -fNg -L 3306:$mysql_host:3306 $ssh_user@$ssh_host");
mysqli_connect("127.0.0.1", $mysql_user, $mysql_pass, $default);

Однако ошибка, которую я получаю сейчас (снова замените $ var значением выше):

mysqli_connect(): (28000/1045): Access denied for user '$mysql_user'@'localhost'

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

На компьютере, на котором вы запускаете MySQL Workbench, запустите сеанс SSH, перенаправив порт MySQL:

ssh -fNg -L 3306:127.0.0.1:3306 myuser@remotehost.com

Если я неправильно понял, и у вас действительно есть ТРИ машины - та, к которой вы используете SSH, та, с которой вы работаете по SSH, и сервер базы данных; или если для аутентификации используется интерфейс внешний (т. е. IP-адрес, к которому вы используете SSH, и сервер БД одинаковы), то вам нужно

ssh -fNg -L 3306:123.45.67.8:3306 myuser@remotehost.com

, где 123.45.67.8 - адрес вашего сервера БД. Это также работает, если 123.45.67.8 - это компьютер, на котором находятся серверы SSH и MySQL, поскольку в противном случае вы можете столкнуться с ошибкой аутентификации (user@123.45.67.8 и user@127.0.0.1 - два разных типа аутентификации).

Теперь с того же компьютера вы можете подключиться к хосту 127.0.0.1 ( не «localhost», так как это может быть интерпретировано как сокет Unix), используя имя пользователя и пароль, которые, как вы знаете, работают на удаленной машине.

Я только что попробовал это на моей тестовой машине, и она работает.

Не забудьте НЕ использовать «сжатый протокол клиента MySQL», иначе вы заметите значительные задержки, так как соединение SSH уже сжато.

(Кроме того, некоторые SSH-шифры дают немного лучшую производительность, чем другие).

0 голосов
/ 31 августа 2018

Вот способ подключения Python с MySQL коннектором Сначала откройте приглашение Python, в основном используйте anaconda, потому что в нем есть все встроенные пакеты, сначала весь импорт mysql.connector, а затем Подключитесь к mysql, как localhost username базы данных паролей, затем введите команды sql для вставки команд поиска delete

0 голосов
/ 31 августа 2018

В зависимости от причины ограничения SSH, ваш вопрос может иметь несколько ответов. Я собираюсь пойти с этим, потому что это мой точный пользовательский случай: служба MySQL обязана принимать соединения только со своего собственного сервера или через частный IP, а серверы приложений, которые его используют, находятся на разных машинах, которые находятся на одном и том же сеть.

Если это так, самый простой способ решить вашу проблему и избавить вас от хлопот, связанных с открытием туннелей между серверами, - это использовать частный IP-адрес сервера MySQL в строке подключения или настроить файл etc / host в вашем приложении. сервер с псевдонимом к частному IP-адресу сервера MySQL.

Таким образом, вы можете использовать только строку mysqli_connect, как обычно,

...