Я успешно подключился к My VPS, используя библиотеку phpscelib. Теперь я хочу подключиться к моей существующей базе данных. Пожалуйста, помогите мне в этом?
<?php set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); include('Net/SSH2.php'); $ssh = new Net_SSH2('192.ccc.ccc.ccc'); if (!$ssh->login('ccc', 'cccc')) { exit('Login Failed'); } echo $ssh->exec("I need to put MySql commands here"); ?>
Во-первых, не было бы лучше разрешить удаленный доступ для этого пользователя к mysql? Однако я не знаю ваших причин.
Наиболее распространенным прозрачным способом будет создание туннеля ssh. Это можно сделать двумя разными способами. Если порт mysql (3306) не открыт на машине mysql, вам понадобится обратный туннель ssh, который должен быть открыт удаленной машиной. Войдите в систему mysql и выполните следующую команду:
ssh -R 12345:localhost:3306 user@php_machine -N
Если порт mysql открыт на удаленной машине, туннель может быть открыт машиной php:
ssh -f user@mysql_machine -L 12345:mysql_machine:3306 -N
Независимо от того, как туннели были созданы, приложение PHP теперь может просто использовать PDO и подключиться к локальному порту 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
Весь трафик будет зашифрован через туннель.
Если вы просто хотите выпустить пару простых команд, вы можете использовать следующую альтернативу.
Самый простой, но небезопасный способ – использовать следующую команду:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Это небезопасно, потому что другие пользователи в системе могут видеть пароль.
Вы можете обойти проблему безопасности, используя expect
. expect
– это программа, которая может более безопасно передавать пароль mysql. Убедитесь, что expect
установлена на удаленной системе. Ниже приведен пример использования команды SHOW TABLES
для test
базы данных:
include('Net/SSH2.php'); $ssh = new Net_SSH2('192.xxx.xxx.xxx'); if (!$ssh->login('ssh_user', 'ssh_password')) { exit('Login Failed'); } echo $ssh->exec('expect <<EOF # disable command output log_user 0 # start the mysqldump process spawn mysql -uTHE_USER -p test -e "SHOW TABLES" # wait for the password prompt expect "password:" # send the password (mind the \r) send "THE_PASSWORD\r" # enable output again log_user 1 # echo all outout until the end expect eof EOF ');
вinclude('Net/SSH2.php'); $ssh = new Net_SSH2('192.xxx.xxx.xxx'); if (!$ssh->login('ssh_user', 'ssh_password')) { exit('Login Failed'); } echo $ssh->exec('expect <<EOF # disable command output log_user 0 # start the mysqldump process spawn mysql -uTHE_USER -p test -e "SHOW TABLES" # wait for the password prompt expect "password:" # send the password (mind the \r) send "THE_PASSWORD\r" # enable output again log_user 1 # echo all outout until the end expect eof EOF ');
Чтобы понять, что происходит, я недавно написал свою статью в блоге об этом.
короткий и простой
echo $ssh->exec('echo "select * from table where company_id=\"15\";" | mysql -u username -password=password database');