Подключение к серверу MySQL через SSH в PHP - PullRequest
19 голосов
/ 21 января 2009

Я прочитал один пост на эту тему, я тоже хочу сделать то же самое,

У меня есть база данных на удаленной машине Linux, и я хочу подключиться с помощью функций ssh ​​и php (в настоящее время я использую библиотеку ssh2 для этого) я попытался использовать mysql_connect, но он дает мне не могу получить доступ (хотя я дал разрешение) когда я пытался использовать эту функцию:

$connection = ssh2_connect('SERVER IP', 22);

ssh2_auth_password($connection, 'username', 'password');

$tunnel = ssh2_tunnel($connection, 'DESTINATION IP', 3307);

$db = mysqli_connect('127.0.0.1', 'DB_USERNAME', 'DB_PASSWORD', 
                         'dbname', 3307, $tunnel)
    or die ('Fail: '.mysql_error());

я получил ошибку "mysqli_connect () ожидает, что параметр 6 будет строкой, задан ресурс", может кто-нибудь помочь мне с этим

Ответы [ 7 ]

33 голосов
/ 22 апреля 2013

Попробуйте это:

Шаг 1.

Чтобы установить туннельное SSH-соединение с сервером MySQL на remotehost.com

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

Ключ здесь -L, который говорит, что мы делаем переадресацию локального порта.

Синтаксис отбрасывания локального порта
Синтаксис немного хитрый, но его можно увидеть так:

<local_port>:<server_addr_remote_end>:<server_port_remote_end> myuser@proxy.com 

Если вас интересуют другие переключатели, они: -f (перейти к фону) -N (не выполнять удаленную команду) -g (разрешить удаленным хостам подключаться к локальным перенаправленным портам)

Аутентификация с открытым ключом, добавьте (-i) переключатель выше:

-i / path / to / public / key

Шаг 2.

Теперь скажите локальному клиенту MySQL подключиться к порту 3307 на вашем компьютере (который пересылается через ssh при подключении к «127.0.0.1:3306» на remotehost.com) через настройку туннеля SSH на шаге 1.

mysql -h 127.0.0.1 -P 3307 -u dbuser -p пароль

Обмен данными между клиентом и сервером теперь передается по зашифрованному ssh-соединению и является безопасным.

Шаг 3.

Теперь подключите ваше PHP-приложение с помощью:

<?php
      $smysql = mysql_connect( "127.0.0.1:3307", "dbuser", "passphrase" );
      mysql_select_db( "db", $smysql ); 
?>

Благодарим великую статью Криса Снайдера на http://chxo.com/be2/20040511_5667.html

GUI Tools

В зависимости от ваших требований альтернативным подходом может быть использование клиента MySQL с графическим интерфейсом с поддержкой туннелирования SSH, такого как http://www.sequelpro.com/, или использование PuTTY для настройки переадресации портов.

ОБНОВЛЕНИЕ 1 Сегодня я рассмотрел жизнеспособный альтернативный инструмент macsh GUI ssh для туннелирования под названием secure pipe , который может оказаться полезным.

1 голос
/ 17 марта 2019

Я искал то же самое, но я предпочитаю не нуждаться во внешних командах и управлять внешними процессами. Так что в какой-то момент я подумал, насколько сложно написать чистый PHP-клиент MySQL, который может работать с любым потоком PHP? На основании документации протокола MySQL у меня ушло около полдня.

https://gist.github.com/UCIS/4e509915ed221660e58f5169267da004

Вы можете использовать это с библиотекой SSH2 или любым другим потоком:

    $ssh = ssh2_connect('ssh.host.com');
    ssh2_auth_password($ssh, 'username', 'password');
    $stream = ssh2_tunnel($ssh, 'localhost', 3306);
    $link = new MysqlStreamDriver($stream, 'SQLusername', 'SQLpassword', 'database');
    $link->query('SELECT * FROM ...')->fetch_assoc();

Он не реализует полный API MySQL, но он должен работать со всеми текстовыми запросами. Пожалуйста, будьте осторожны, если вы решите использовать это, я еще не проверил код полностью, а код экранирования строки не проверялся.

1 голос
/ 12 сентября 2017

К сожалению, туннель ssh2, предлагаемый php, не может обрабатывать удаленное соединение mysql, так как вы не можете указать локальный порт для туннеля (он работает только с портом 22 или любым другим портом ssh, на котором работает удаленный сервер). Мое решение для этого состоит в том, чтобы просто открыть туннель через оператора exec() и подключиться оттуда как обычно:

exec('ssh -f -L 3307:127.0.0.1:3306 user@example.com sleep 10 > /dev/null');
$mysqli = new mysqli('127.0.0.1', 'user', 'password', 'database', '3307');
1 голос
/ 21 января 2009

Согласно документам , последний параметр должен быть именем сокета или канала, что-то вроде '/var/run/mysql/mysql.sock'. Поскольку вы не подключаетесь с помощью сокета UNIX, это не относится к вам ... поэтому попробуйте просто пропустить его.

0 голосов
/ 21 ноября 2017

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

Я получил это на работу, выполнив следующие шаги:

Шаг 1: разрешить хост 127.0.0.1 для целевого пользователя

SSH обычно на вашем сервере и войдите в систему как пользователь root mysql, затем введите команду:

GRANT ALL ON yourdbname.* TO yourdbuser@127.0.0.1 IDENTIFIED BY 'yourdbpassword';

Ключ, конечно, указывает 127.0.0.1 выше.

Шаг 2: Запустите локальный SSH-туннель к MySQL

Теперь вы можете запустить локальный SSH-туннель к удаленному серверу MySQL, например:

ssh -vNg -L 33306:127.0.0.1:3306 sshuser@remotehost.com

-v заставляет ssh работать в подробном режиме, который помогает увидеть, что происходит. Например, при попытке подключения вы увидите вывод отладочной информации, такой как эта, на консоли терминала:

debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.

и выводить, когда вы закрываете соединение:

debug2: channel 2: is dead
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 33306 for 127.0.0.1 port 3306, connect from 127.0.0.1 port 52112 to 127.0.0.1 port 33306, nchannels 3

-N заставляет ssh не выдавать команды, а просто подождать после установления соединения.

-g позволяет удаленным хостам подключаться к локальным перенаправленным портам. Не совсем уверен, если это необходимо, но это может быть полезно для мультиплексирования нескольких соединений через один туннель SSH.

-L Это основной параметр, который указывает локальный порт 33306 для подключения к локальному IP-адресу удаленного хоста 127.0.0.1 и порт mysql удаленного хоста, обычно 3306.

Вы можете использовать любые механизмы / другие параметры, необходимые после этого для подключения через SSH к удаленному хосту. В моем случае я использую ключевые файлы, настроенные в моем ~/.ssh/config, поэтому мне просто нужно указать user@host, чтобы войти.

При вводе такой команды SSH запускается на переднем плане, поэтому я могу легко закрыть ее с помощью Ctrl + C. Если вы хотите запустить этот туннель в фоновом режиме, вы можете добавить -f, чтобы сделать это.

Шаг 3. Подключение из PHP / других совместимых с MySQL методов

SSH-туннель, запущенный сверху на вашем локальном хосте, будет вести себя точно так же, как если бы ваш mysql работал на 127.0.0.1. Я использую порт 33306 (обратите внимание на тройку 3), который позволяет мне запускать мой локальный сервер sql на своем обычном порту. Теперь вы можете подключиться, как обычно. Команда mysql на терминале выглядит следующим образом:

mysql -h 127.0.0.1 -P 33306 -u yourmysqluser -p

где -P (заглавная P) указывает порт, к которому локальный конец вашего SSH-туннеля принимает соединения. Важно использовать 127.0.0.1 IP-адрес вместо localhost, потому что mysql cli попытается использовать сокет linux для подключения.

Для строк подключения PHP моя строка имени источника данных (для моей конфигурации Yii2) выглядит следующим образом:

'dsn' => 'mysql:host=127.0.0.1;dbname=yourdbname;port=33306',

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

0 голосов
/ 26 марта 2017

Убедитесь, что ваше имя пользователя и пароль, с которыми вы соединяетесь, имеют правильные права доступа к имени хоста. Я считаю, что вы можете использовать «%» для подстановочного знака. Кроме того, если вы подключаетесь к удаленному компьютеру (который, как я полагаю, вы делаете, если вы пытаетесь подключиться к нему по протоколу ssh), который находится не в вашей локальной сети, вам нужно будет перенаправить порты на маршрутизаторе, где сервер предназначен для внешнего трафика возможность подключиться к нему.

http://www.lanexa.net/2011/08/create-a-mysql-database-username-password-and-permissions-from-the-command-line/

0 голосов
/ 23 января 2009

даже я попробовал это сделать, выполнив ssh как с правами суперпользователя, так и с парой открытого личного ключа, но это позволяет мне соединяться через командную строку, а не через код php Я попытался также создать туннель (используя функции ssh2) и запустить команды оболочки из кода php (system, exec и т. Д.), Но ничего не получалось. Наконец, я попробовал функцию ssh2, чтобы выполнить команду оболочки, и это, наконец, сработало :) Вот код, если вам это поможет: ----

$connection = ssh2_connect($remotehost, '22');
if (ssh2_auth_password($connection, $user,$pass)) { 
    echo "Authentication Successful!\n";
} else {
    die('Authentication Failed...');
}

$stream=ssh2_exec($connection,'echo "select * from zingaya.users where id=\"1606\";" | mysql');
stream_set_blocking($stream, true);
while($line = fgets($stream)) { 
    flush();
    echo $line."\n";
}

это сработало для меня, попробуйте это, если хотите использовать функции php специально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...