Подтвердить что ты не робот

Подключение к серверу MySQL через SSH в PHP

У меня есть база данных на удаленном компьютере с 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 будет строкой, ресурс задан". Как я могу решить это?

4b9b3361

Ответ 1

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

Шаг 1.

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

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

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

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

<local_port>:<server_addr_remote_end>:<server_port_remote_end> [email protected] 

Если вы заинтересованы в других коммутаторах, они:

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

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

-i/путь/к/публичный/ключ

Шаг 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

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

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

Ответ 2

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

exec('ssh -f -L 3307:127.0.0.1:3306 [email protected] sleep 10 > /dev/null');
$mysqli = new mysqli('127.0.0.1', 'user', 'password', 'database', '3307');

Ответ 3

Я искал то же самое, но я предпочитаю не нуждаться во внешних командах и управлять внешними процессами. Так что в какой-то момент я подумал, насколько сложно написать чистый 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, но он должен работать со всеми текстовыми запросами. Пожалуйста, будьте осторожны, если вы решите использовать это, я еще не проверил код полностью, а код, исключающий строки, не был проверен.

Ответ 4

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

Ответ 5

даже я попробовал это, выполнив ssh как с помощью учетных данных root, так и с парной открытого частного ключа, но он позволяет мне взаимодействовать через командную строку, но не через php-код. Я также попытался создать туннель (используя функции ssh2), ans запускает команды оболочки из 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 специально.

Ответ 6

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

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

Ответ 7

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

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

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

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

GRANT ALL ON yourdbname.* TO [email protected] IDENTIFIED BY 'yourdbpassword';

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

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

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

ssh -vNg -L 33306:127.0.0.1:3306 [email protected]

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

debug1: client_input_global_request: rtype [email protected] 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, поэтому мне просто нужно указать [email protected], чтобы войти.

Выдавая команду, подобную этой, запускается 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 (capital P) указывает порт, в котором ваш локальный конец туннеля SSH принимает соединения. Важно использовать IP-адрес 127.0.0.1 вместо localhost, потому что mysql cli попытается использовать сокет linux для подключения.

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

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

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