Php-Pdo Ssh Туннель

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

try {

    $host = 'remote host';
    $sshuser = 'ssh user';
    $sshpass = 'ssh password';
    $dbuser = 'db user';
    $dbpass = 'db user';
    $dbname = 'db name';

    shell_exec("ssh -p$sshpass ssh -o StrictHostKeyChecking=no -f -L 3307:127.0.0.1:3306 $sshuser@$host");

    $dbh = new PDO('mysql:host=127.0.0.1;port=3307;dbname=' .$dbname. '', $dbuser, $dbpass);

    $sth = $dbh->prepare("SELECT * from table");

    $sth->execute();

    $result = $sth->fetchAll();

    print_r ($result);

    shell_exec("kill $(ssh-pid)");

    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

И в результате получаю:

Error!: SQLSTATE[HY000] [1130] Host 'host' is not allowed to connect to this MySQL server

person Creative crypter    schedule 02.05.2016    source источник
comment
Туннель ssh остается активным? Сервер базы данных уже работает локально на порту 3307? Какое реальное разрешение на подключение/аутентификацию серверов MySQL для этого пользователя?   -  person mario    schedule 02.05.2016
comment
Вы нашли решение?   -  person PeMa    schedule 08.12.2017


Ответы (2)


-p$sshpass ssh Эта конкретная часть команды ssh кажется мне немного странной. Вероятно, после -p должен быть пробел, а ssh тоже не должно быть.

Кроме того, опция -p предназначена для порта, а не для пароля.

person Leonardo Raele    schedule 12.06.2019

Это то, что сработало для меня

ВМ и VPN

Если у вас есть виртуальная машина, сначала подключитесь к ней по ssh.
Если у вас возникают проблемы с DNS, используйте DNS-сервер Google: sudo nano /etc/resolv.conf измените 127… на 8.8.8.8.

мой туннель требует, чтобы я подключался через vpn, я использовал openvpn, вы можете установить его следующим образом:

sudo yum -y install openvpn

подключиться к vpn скачать myconfig.ovpn от провайдера vpn

sudo openvpn --config myconfig.ovpn 

Ключ SSH

загрузите свой ключ на виртуальную машину, исправьте разрешения

sudo chmod 600 ~/.ssh/my-private-ssh-key

Переадресация порта

ssh -f -N -i ~/.ssh/my-private-ssh-key [email protected] -L 3307:yourmysqldbdomain.com:3306

-f запустит его в фоновом режиме
-L перенаправит 127.0.0.1:3307, чтобы указать на yourmysqldbdomain.com:3306

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

вы можете удалить условия -f и -L и вместо этого добавить -v для отладки, например так

ssh -v -i ~/.ssh/my-private-ssh-key [email protected]

Подключиться к mysql

mysql -u yourdbusername -h 127.0.0.1 -P 3307 -p

Подключиться к PHP PDO

$db_server = '127.0.0.1';
$db_port = '3307';
$db_name = 'yourdbname';
$db_user = 'yourdbusername';
$db_pass = 'yourdbpassword';

$dsn = 'mysql:host='.$db_server.';dbname='.$db_name.';port='.$db_port;
$driver_options = [
   PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
   PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
   PDO::ATTR_TIMEOUT => 5, // timeout in seconds
];               
$pdo = new PDO($dsn, $db_user, $db_pass, $driver_options);

Удалить переадресацию портов

Как только вы закончите, вы можете убить процесс, найдя такой идентификатор:

ps aux | grep ssh
sudo kill 123123 // replace 123123 with the id of the process
person Timo Huovinen    schedule 11.01.2021