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

Я хотел бы установить туннель ssh через ssh на мой сервер mysql.

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

Я на общем хосте, у которого нет библиотек SSH2, но я мог бы установить их локально, используя PECL.

Если есть способ, который использует собственные команды, это было бы здорово.

Я думал о чем-то подобном, но без этих библиотек это не сработает.

$connection = ssh2_connect('SERVER IP', 22); ssh2_auth_password($connection, 'username', 'password'); $tunnel = ssh2_tunnel($connection, 'DESTINATION IP', 3307); $db = new mysqli_connect('127.0.0.1', 'DB_USERNAME', 'DB_PASSWORD', 'dbname', 3307, $tunnel) or die ('Fail: ' . mysql_error()); 

У кого-нибудь есть идеи? Я запускаю общий хост CentOS linux на liquidweb.

Любые мысли о постоянстве туннелирования? Можно ли установить его с помощью другого скрипта и просто воспользоваться его в PHP ?

Благодарю.

Эрик,

Я думаю, тебе не повезло. Вы можете либо использовать расширение ssh в своем PHP-коде, либо если у вас есть доступ к серверу, вы можете попытаться создать туннель ssh в командной строке.

Однако вам, вероятно, нужны специальные разрешения. Также похоже, что у вас нет доступа к этой учетной записи хостинга.

–Joao

Я бы использовал инструмент autossh для создания постоянного туннеля ssh в вашей базе данных mysql. Тогда все, что вам нужно сделать в вашем PHP-коде, это указать его на localhost.

Вы можете протестировать это (без автоматического перезапуска), выполнив:

 ssh -L 3306:localhost:3306 [email protected] 

Установите ключ ssh, чтобы вам не нужно было использовать пароли, а также настроить файл .ssh / authorized_keys в системе mysql, чтобы разрешить его использовать для переадресации портов.

Для получения дополнительной информации о трюках ssh см . Превосходную серию Brian Hatch по SSH и переадресации портов.

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

Туннель должен оставаться открытым во время действия (-ов) SQL. Следующий пример из RJMetrics объясняет:

Вот общий синтаксис команды SSH:

 ssh -f -L bind-ip-address:bind-port:remote-ip-address:remote-port \ [email protected] [command] >> /path/to/logfile 

Вот как безопасно установить удаленное соединение с базой данных всего за 2 строки кода PHP:

 shell_exec("ssh -f -L 127.0.0.1:3307:127.0.0.1:3306 [email protected] sleep 60 >> logfile"); $db = mysqli_connect("127.0.0.1", "sqluser", "sqlpassword", "rjmadmin", 3307); 

Мы используем shell_exec() для создания туннеля с 60-секундным открывающим окном, а затем с помощью функции mysqli_connect() для открытия соединения с базой данных с использованием перенаправленного порта. Обратите внимание, что мы должны использовать библиотеку «mysqli» здесь, потому что mysql_connect() не позволяет нам указывать порт, а функции mysql_* устарели.

sleep 60 : Когда речь заходит о туннельных соединениях, у нас в основном есть два варианта: оставьте соединение открытым все время или откройте его и закройте его по мере необходимости. Мы предпочитаем последнее, и поэтому мы не указываем параметр -N при создании туннеля, который оставил бы его открытым до тех пор, пока процесс не будет вручную убит (плохой для автоматизации). Поскольку -N не указывается, наш туннель закроется, как только его сеанс SSH не будет использоваться ни для чего. Это идеальное поведение, за исключением нескольких секунд между тем, когда мы создаем туннель, и когда мы получаем соединение MySQL и запускаем его через туннель. Чтобы купить нам некоторое время в течение этого периода, мы выдаем команду безвредного sleep 60 при создании туннеля, которая в основном покупает нам 60 секунд, чтобы получить что-то еще, проходящее через туннель, до того, как оно закроется. Пока соединение MySQL устанавливается в этот таймфрейм, мы все настроены.

Это возможно, но почему? Это сложнее, чем нужно, и склонность к ошибкам.

Не можете ли вы запустить локальную базу данных? Если нет, не можете ли вы использовать что-то вроде SQLite, XML-файлов или чего-то еще, что не требует отдельного демона сервера?

Вы действительно не хотите инициализировать туннель внутри PHP-скриптов. Инициализация туннеля SSH занимает много времени (может быть легко второй или второй), поэтому это означает, что каждая страница, которая подключается к базе данных, будет иметь задержку в 2 секунды при загрузке.

Если вам нужно это сделать (что я настоятельно рекомендую против), лучшим способом будет иметь скрипт, поддерживающий соединение в фоновом режиме.

Установите пару ключей SSH . Затем, используя autossh или простой скрипт, который выполнит требуемую команду SSH, дождитесь завершения процесса и повторного запуска. Это может быть более разумным и попробовать и запустить команду каждые 10-20 секунд, повторно подключаясь, если это не удастся.

Используя пару ключей SSH, вам не нужно будет жестко указывать пароль удаленных пользователей в скрипте. Я бы рекомендовал ограничить то, что может сделать удаленный пользователь (используя выделенный пользователь туннеля и предоставляя ему ограниченную оболочку, см. Этот вопрос)

Короче говоря, я бы настоятельно предложил сначала попробовать SQLite, а затем посмотреть, насколько это возможно для хранения данных с помощью XML-файлов, а затем попытаться прослушивать ваш веб-узел о получении локального сервера MySQL, а затем заглянуть в туннелирование SSH.

Я думаю, ваш лучший выбор – найти другого хостинг-провайдера; Я предлагаю решение VPS (Virtual Private Server), которое дает вам полный контроль над вашим веб-хостом. Таким образом, если вам не нравится настройка по умолчанию, вы можете обновить ее самостоятельно.

  • Как выполнять команды на сервере SSH в C #?
  • SSH не читает файлы rc
  • Почему автоматическая установка sshfs с помощью autofs завершается с ошибкой?
  • SSH работает в шпаклере, но не в терминале
  • Linux: Постоянно синхронизировать файлы, в одну сторону
  • Как заставить клавиши HOME или END работать в mc, работающем на OS X (ssh)
  • SSH Advanced Logging
  • Scp между двумя удаленными хостами от моего (третьего) компьютера
  • Настройка учетных записей Linux-оболочки для общего доступа
  • Как запустить командный файл в PuTTY с помощью автоматического входа в командной строке?
  • Можно ли заставить SSH передавать пустые аргументы?
  • Давайте будем гением компьютера.