Подключение к MySQL через SSH в переполнении стека

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

У меня есть база данных, к которой я могу получить доступ только через 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 [email protected]

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

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

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

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

РЕДАКТИРОВАТЬ

Что касается комментариев @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'

0

Решение

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

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

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

0

Другие решения

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

ssh -fNg -L 3306:127.0.0.1:3306 [email protected]

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

ssh -fNg -L 3306:123.45.67.8:3306 [email protected]

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

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

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

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

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

0

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

0
По вопросам рекламы [email protected]