Подключение к серверу 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 будет строкой, указанным ресурсом", может ли кто-нибудь помочь мне в этом

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

Шаг 1.

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

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

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

-i / path / to / public / key

Шаг 2.

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

mysql -h 127.0.0.1 -P 3307 -u dbuser -p db

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

Шаг 3.

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

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

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

В зависимости от ваших требований альтернативным подходом было бы использование клиента GUI с поддержкой SSH Tunneling. Один из моих любимых и бесплатных инструментов:

http://www.sequelpro.com/

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

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

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

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

К сожалению, туннель 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'); 

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

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

Шаг 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 принимает соединения. Важно использовать IP-адрес 127.0.0.1 вместо localhost потому что mysql cli попытается использовать сокет linux для подключения.

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

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

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